Python TemporaryDirectory 在“with”语句中使用时返回字符串问题的简短版本为什么TemporaryDirectory在with上下文中使用时返回一个字符串?更长版本的问题下面是一些 Python 代码的例子,它创建一个临时目录tempdir并打印相应的对象:>>> import tempfile>>> tempdir = tempfile.TemporaryDirectory(dir="/tmp")>>> print(tempdir)<TemporaryDirectory '/tmp/tmpf2yh8xu9'>>>> print(type(tempdir))<class 'tempfile.TemporaryDirectory'>正如预期的那样,tempdir是TemporaryDirectory.这是一个类似的例子,我with在调用时使用了一个语句TemporaryDirectory:>>> import tempfile>>> with tempfile.TemporaryDirectory(dir="/tmp") as tempdir: print(tempdir)/tmp/tmp7mlmzegs>>> with tempfile.TemporaryDirectory(dir="/tmp") as tempdir: print(type(tempdir))<class 'str'>在这种情况下,tempdir是一个字符串。当我查看类的__enter__方法时TemporaryDirectory,我看到以下内容:def __enter__(self): return self.name果然 - 看起来像返回一个字符串而不是对象本身。造成这种差异的原因是什么?为什么该__enter__方法返回文件名而不是文件对象?
2 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
从tempfile.py, 在TemporaryDirectory类中的来源:
def __enter__(self):
return self.name
至于“为什么”:__enter__和__exit__方法在一个with块中控制类的行为,显然,TemporaryDirectory该类选择只给你位置 - 可能是为了避免篡改类和之后的清理。例如,.cleanup()在with块结束之前调用。
这将是不可取的:
with TemporaryDirectory('/tmp') as td:
td.cleanup()
而且由于TemporaryDirectory除此之外没有提供其他方法,我认为设计决策是有道理的,尽管对开发人员来说令人惊讶的是一个缺点。如果可以避免,代码应该不足为奇。
当年话下
TA贡献1890条经验 获得超9个赞
为什么enter方法返回的是文件名而不是文件对象?
没有差异:tempfile.TemporaryDirectory
不是文件对象。
它只是某种“上下文管理器”来表示with
-block内的上下文,它包装了一个str
存储由mkdtemp
. TemporaryDirectory
除了获取name
(for which __enter__
is return) 和cleanup
(for which __exit__
is invoking) 之外,您可以使用该对象没有任何意义
添加回答
举报
0/150
提交
取消