2017-01-06 32 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

相關問題