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

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__方法返回文件名而不是文件对象?


白猪掌柜的
浏览 331回答 2
2回答

凤凰求蛊

从tempfile.py, 在TemporaryDirectory类中的来源:def __enter__(self):&nbsp; &nbsp; return self.name至于“为什么”:__enter__和__exit__方法在一个with块中控制类的行为,显然,TemporaryDirectory该类选择只给你位置 - 可能是为了避免篡改类和之后的清理。例如,.cleanup()在with块结束之前调用。这将是不可取的:with TemporaryDirectory('/tmp') as td:&nbsp; &nbsp; td.cleanup()而且由于TemporaryDirectory除此之外没有提供其他方法,我认为设计决策是有道理的,尽管对开发人员来说令人惊讶的是一个缺点。如果可以避免,代码应该不足为奇。

当年话下

为什么enter方法返回的是文件名而不是文件对象?没有差异:tempfile.TemporaryDirectory不是文件对象。它只是某种“上下文管理器”来表示with-block内的上下文,它包装了一个str存储由mkdtemp.&nbsp;TemporaryDirectory除了获取name&nbsp;(for which&nbsp;__enter__is return) 和cleanup(for which&nbsp;__exit__is invoking) 之外,您可以使用该对象没有任何意义
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python