为了账号安全,请及时绑定邮箱和手机立即绑定

Python TemporaryDirectory 在“with”语句中使用时返回字符串

Python TemporaryDirectory 在“with”语句中使用时返回字符串

白猪掌柜的 2021-12-16 16:42:52
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除此之外没有提供其他方法,我认为设计决策是有道理的,尽管对开发人员来说令人惊讶的是一个缺点。如果可以避免,代码应该不足为奇。


查看完整回答
反对 回复 2021-12-16
?
当年话下

TA贡献1890条经验 获得超9个赞

为什么enter方法返回的是文件名而不是文件对象?

没有差异:tempfile.TemporaryDirectory不是文件对象。

它只是某种“上下文管理器”来表示with-block内的上下文,它包装了一个str存储由mkdtempTemporaryDirectory除了获取name (for which __enter__is return) 和cleanup(for which __exit__is invoking) 之外,您可以使用该对象没有任何意义


查看完整回答
反对 回复 2021-12-16
  • 2 回答
  • 0 关注
  • 321 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信