为何使用with关键字调用tempfile.TemporaryDirectory()时返回类型会变化?
关于tempfile.TemporaryDirectory()返回类型差异的解释
直接看现象:当直接赋值tempfile.TemporaryDirectory()时,得到的是tempfile.TemporaryDirectory类的实例;但用with语句时,as后面的变量是字符串类型的路径。
测试代码如下:
import tempfile temp_dir = tempfile.TemporaryDirectory() print(type(temp_dir)) # 输出:<class 'tempfile.TemporaryDirectory'> with tempfile.TemporaryDirectory() as temp_dir: print(type(temp_dir)) # 输出:<class 'str'>
对比subprocess.Popen(),不管是否用with,返回的都是subprocess.Popen实例:
import subprocess cmd="ls -l" response = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(type(response)) # 输出:<class 'subprocess.Popen'> with subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as response: print(type(response)) # 输出:<class 'subprocess.Popen'>
原因解释
这是因为Python的with语句依赖对象的__enter__()方法——当进入with代码块时,会调用该方法,并把它的返回值赋值给as后面的变量:
- 对于
tempfile.TemporaryDirectory类,它的__enter__()方法返回的是临时目录的路径字符串,而非实例本身。这样设计是为了方便开发者直接拿到路径使用,无需额外调用实例的name属性。 - 而
subprocess.Popen的__enter__()方法返回的是实例自身,所以不管直接赋值还是用with,得到的都是同类型对象。
另外,TemporaryDirectory的实例也可以通过.name属性获取路径:
temp_dir = tempfile.TemporaryDirectory() print(temp_dir.name) # 输出临时目录的路径字符串
内容的提问来源于stack exchange,提问作者Charley
相关产品推荐
相关产品推荐

