【问题标题】:Function calling a function; why does this return NoneType instead of reading file?函数调用函数;为什么这会返回 NoneType 而不是读取文件?
【发布时间】:2017-01-06 18:27:44
【问题描述】:

在阅读了 Pydoc 中的文件对象以及函数如何调用函数之后,我重写了 Zed Shaw 的 LPTHW 脚本之一,试图了解它是如何工作的。

代码如下:

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而不是读取文件?

【问题讨论】:

    标签: python-2.7 file nonetype


    【解决方案1】:

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

    def open_file(f):
        return open(f)
    

    一个函数在没有显式返回值的情况下到达其末尾会返回None,因此您会收到异常,因为您的代码正在尝试执行read_file(None),而后者又尝试执行None.read()None 对象没有 read() 方法。

    【讨论】:

    • 我现在明白了;有时候,这是最简单的事情。
    【解决方案2】:

    答案如下:

    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.
    

    【讨论】:

    • 很好奇为什么接受的答案会改变。鼓励回答者解释错误是什么以及它导致观察到的行为的原因,这就是我所做的。
    • 根据我的理解,我们也鼓励发帖者尽可能提供自己的答案。还是我误会了?没有丝毫的意思。
    • 回答您自己的问题没有错,但请注意,它不会将您的答案浮到顶部或给您(或任何人)声誉,因此除非有没有其他答案或任何其他答案严重缺乏。如果缺少其他答案,则需要提供更多信息的评论将是很好的第一步。
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2022-01-16
    • 2019-11-23
    • 2015-08-18
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多