Python 作为字典构造的一部分打开文件后会关闭它吗?

Python 作为字典构造的一部分打开文件后会关闭它吗?,python,file-io,Python,File Io,我在处理Python请求库时看到了以下语法: body = { file_name: open(file_path, 'rb') } 我不知道这是否会关闭文件,因为我多次看到它是这样写的。将我的评论重新发布为已接受的答案: 基本上是这样的:当open()返回的file对象不再引用它时,文件将被关闭。在这种情况下,引用由字典持有,但同样地,如果没有对字典的引用,那么当文件超出范围时,它也会删除对该文件的引用。这可能导致错误,文件句柄保持打开状态。如果您使用Python-Wall运行,Python

我在处理Python请求库时看到了以下语法:

body = { file_name: open(file_path, 'rb') }

我不知道这是否会关闭文件,因为我多次看到它是这样写的。

将我的评论重新发布为已接受的答案:


基本上是这样的:当
open()
返回的file对象不再引用它时,文件将被关闭。在这种情况下,引用由字典持有,但同样地,如果没有对字典的引用,那么当文件超出范围时,它也会删除对该文件的引用。这可能导致错误,文件句柄保持打开状态。如果您使用
Python-Wall
运行,Python 3将对此发出警告。对于只读文件,它基本上是无害的,因为没有数据可以刷新到磁盘。但我还是会避免这样

例如:

$ python3 -Wall
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> {'f': open('.bashrc')}
{'f': <_io.TextIOWrapper name='.bashrc' mode='r' encoding='UTF-8'>}
>>> exit()
sys:1: ResourceWarning: unclosed file <_io.TextIOWrapper name='.bashrc' mode='r' encoding='UTF-8'>
这是因为在最后一种情况下,REPL中的最后一个返回值存储在特殊变量
\uu

事实上,在文件对象的
\uu del\uu
被显式关闭之前调用时,将随时引发此
ResourceWarning

$ python3 -Wall
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('.bashrc')
>>> del f
__main__:1: ResourceWarning: unclosed file <_io.TextIOWrapper name='.bashrc' mode='r' encoding='UTF-8'>

这回答了你的问题吗?这个问题问关闭文件是否重要,最上面的答案基本上是“是的,将数据刷新到磁盘”。我可能错了,但我认为这并不能回答我的具体情况。它基本上是这样的:当
open()
返回的file对象不再引用它时,文件将被关闭。在这种情况下,引用由字典持有,但同样地,如果没有对字典的引用,那么当文件超出范围时,它也会删除对该文件的引用。这可能导致错误,文件句柄保持打开状态。如果您使用
Python-Wall
运行,Python 3将对此发出警告。对于只读文件,它基本上是无害的,因为没有数据可以刷新到磁盘。但我还是会避免的。@Iguanaut谢谢你,这正是我所希望的答案。我也不知道Python有一个墙开关。如果你愿意的话,你可以把这个作为一个答案贴出来,这样我就可以接受了。
$ python3 -Wall
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('.bashrc')
>>> del f
__main__:1: ResourceWarning: unclosed file <_io.TextIOWrapper name='.bashrc' mode='r' encoding='UTF-8'>
>>> with open(file_path, 'rb') as fobj:
...     body = { file_name: fobj }
...     # send request, etc...