2017-01-06 29 views
0

在阅读了Pydoc中的文件对象并查看了函数如何调用函数之后,我重写了Zed Shaw的LPTHW脚本之一,试图了解它是如何工作的。调用函数的函数;为什么这会返回NoneType而不是读取文件?

下面是代码:

def open_file(f): 
    open(f) 

def read_file(f): 
    f.read() 

read_file(open_file('test.txt')) 

这里是错误:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in read_file 
AttributeError: 'NoneType' object has no attribute 'read' 

然而这工作得很好:

input_file = 'test.txt' 

print open(input_file).read() 

为什么函数调用函数的版本返回NoneType而不是读取文件?

回答

3

您的open_file()函数实际上并不返回任何内容。你想要的是:

def open_file(f): 
    return open(f) 

到达其终点没有明确地返回一个值的函数返回None,让你得到的异常,因为你的代码试图执行read_file(None),这反过来又试图执行None.read()None对象没有read()方法。

+1

我现在明白了;这是最简单的事情,有时让我。 –

0

下面是答案:

def open_file(f): 
    return open(f) 

def read_file(f): 
    print f.read() 

read_file(open_file('test.txt')) 

其中给出的输出:

Mary had a little lamb. 
Its fleece was white as snow. 
It was also very tasty. 
+1

好奇为什么接受答案的变化。鼓励回应者提供解释错误是什么以及为什么导致观察到的行为,这就是我所做的。 – glibdud

+0

根据我的理解海报,也鼓励在可能的情况下提供自己的答案。或者我误解了?没有轻微的意思。 –

+0

回答自己的问题没有错,但请注意,它不会将答案浮动到顶部或给予(或任何人)声望,所以除非没有其他答案或任何其他答案,否则通常没有多少意义。严重缺乏。如果其他答案*缺乏,请求提供补充信息的评论将是一个好的第一步。 – glibdud

相关问题