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

时间:2019-03-26 01:35:08

标签: python python-3.x

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'>

按预期,tempdirTemporaryDirectory的实例。

这是一个类似的示例,在调用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 个答案:

答案 0 :(得分:0)

TemporaryDirectory的源开始,在def __enter__(self): return self.name 类中:

__enter__

关于“为什么”:__exit__with方法控制TemporaryDirectory块中类的行为,显然,.cleanup()类选择仅给您位置-可能是为了避免在以后篡改课堂和清理工作。例如,在with块结束之前调用with TemporaryDirectory('/tmp') as td: td.cleanup()

这是不可取的:

TemporaryDirectory

并且由于this除此以外没有其他方法,因此我认为设计决策是有道理的,尽管对开发人员来说是个意外。如果可以避免的话,代码也就不足为奇了。

答案 1 :(得分:0)

  

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

没有差异:df.y=np.array(l)[df.y-1]# here i subtract 1 since the index from pandas or numpy is from 0 by default df Out[52]: x y 0 1 7 1 2 5 2 4 1 3 7 2 不是文件对象。

这只是某种形式的“上下文管理器”,用于表示tempfile.TemporaryDirectory块内的上下文,该块包装了with并存储了str创建的路径。您可以使用mkdtemp对象没有什么意义,但是可以得到TemporaryDirectory(正在返回name)和__enter__(正在为其cleanup调用) )