我在查找错误时遇到了一些麻烦:我写了
myfile.close
而不是
myfile.close()
我很惊讶并且有点不高兴python没有反对;怎么会? BTW文件没有关闭。 (Ubuntu上的python 2.7)
答案 0 :(得分:3)
在python方法中是第一类对象,你可以这样写:
my_close = myfile.close
my_close()
因为表达式不必分配给某个变量
2 + 3
一个简单的
myfile.close
也有效。
答案 1 :(得分:1)
这是因为myfile.close
返回一个方法。
如果您执行print(myfile.close)
,您将获得如下输出:
<built-in method close of file object at 0x7fb672e0f540>
答案 2 :(得分:1)
Python文件对象具有内置方法close()
来处理文件对象。
在您的情况下,myfile.close
将返回方法对象引用,但不会被调用。
这个例子可能有助于理解这一点:
>>> def test():
... print 'test print'
...
>>> a = test
>>> print(a)
<function test at 0x7f6ff1f6ab90>
>>>
答案 3 :(得分:1)
myfile.close
是类文件对象的成员函数。您的代码只是“提及”此功能,但不会调用它(这就是文件未关闭的原因)。
这与此相同:
a = 5
a # OK but does nothing
def test():
return 256
test # also not an error, but useless in this case
现在,你可能会说,为什么即使这完全无用也允许这个?嗯,不太好。有了这个,您可以将函数作为参数传递给其他函数,例如。
def MyMap(function, iterable):
for x in iterable:
yield function(x)
print(list(MyMap(str, range(5))))
答案 4 :(得分:1)
fp.close
是文件对象的方法。
>>> fp.close
<built-in method close of file object at 0xb749c1d8>
fp.close()
是使用()
>>> fp.close()
您可以按照演示更详细地了解。
我们定义test
函数,我们test
和test()
看到差异。
>>> def test():
... return 1
...
>>> test
<function test at 0xb742bb54>
>>> test()
1
答案 5 :(得分:0)
您的代码不会抛出错误,因为您不必为表达式的结果指定名称(编辑:或语句)。 Python允许这样做,因为你可能只需要表达式/语句来获得某种副作用,而不是实际的返回值。
在推进迭代器而不为生成的对象指定名称时,通常会看到这种情况,即只有一行
next(myiter, None)
代码中的。
如果你想要没有副作用的表达式,比如
1 + 1
或
myfile.close
如果没有为结果分配名称(因此表达式没用)则抛出错误Python必须检查表达式的每个右侧是否存在可能的副作用。与仅仅允许这些表达式的当前行为相比,这似乎是不必要的昂贵(并且对于每个表达式也是非常复杂的,如果不是不可能的话)。
考虑动态Python是怎样的。您可以覆盖+
运算符在运行时对某些类型执行的操作。