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