【问题标题】:Difference between f.close(), f.close and f.closedf.close()、f.close 和 f.closed 的区别
【发布时间】:2020-05-19 00:17:12
【问题描述】:
with open('new.txt', 'r+') as f:
    print(f.readline())


if f.close:
    print('It is closed')
else:
    print('It is open.')

如果我运行此代码,则输出 'It is closed'。但是,如果我将 if 语句从 f.close 更改为 f.closed(),我会得到输出 'It is open'。那么我的文件是关闭还是打开?为什么我得到不同的输出?

【问题讨论】:

  • 你试过print(f.close)print(f.closed())比较吗?
  • 你正在使用with open,所以你甚至不应该打电话给.close
  • @bereal print(f.close) 给了我<built-in method close of _io.TextIOWrapper object at 0x0000020745364AC8> 而另一个显示错误说bool object is not callable

标签: python python-3.x file file-io with-statement


【解决方案1】:

f.close 是对file 对象的close 方法的引用,因此当作为布尔值读取时,总是计算为Truef.close() 是对该方法的调用,它不返回任何内容,因此将始终计算为 False,因为 bool(None) 的计算结果为 Falsef.closed 是一个布尔属性,它告诉我们文件是否关闭。如果您将代码更改为:

if f.closed:
    print('It is closed')
else:
    print('It is open.')

这将返回您期望的结果。由于您使用了with ... as f,您的文件将在您离开该语句的范围后自动关闭,因此您不必担心使用f.close()

【讨论】:

    【解决方案2】:

    f.close 是函数对象,因此使用if f.close 不会调用该函数。 if f.close 因此总是评估为 True。此外,如果该方法不存在,它不会返回 False,它会提供语法错误。

    >>> type(f.close)
    <class 'builtin_function_or_method'>
    >>> type(f.doesnotexist)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: '_io.TextIOWrapper' object has no attribute 'doesnotexist'
    

    您可以通过检查 bool(.) 函数返回的内容来检查 if f.close 的评估结果:

    >>> bool(f.close)
    True
    

    从中我们可以看出 this 的计算结果为真。

    f.closed 是告诉您文件是否已关闭的成员(with 会自动关闭),f.close() 会关闭您的文件。

    f.closed() 引发 TypeError,因为 f.closed 是布尔值,因此无法调用:

    >>> f.closed()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'bool' object is not callable
    

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 2020-02-12
      • 2013-08-07
      • 2011-10-20
      • 2020-01-23
      • 1970-01-01
      • 2014-10-09
      • 2010-12-21
      • 2011-05-11
      相关资源
      最近更新 更多