【问题标题】:TypeError: 'generator' object is not callableTypeError:“生成器”对象不可调用
【发布时间】:2012-08-17 23:18:30
【问题描述】:

我有一个这样定义的生成器:

def lengths(x):
    for k, v in x.items():
        yield v['time_length']

它的工作原理,调用它

for i in lengths(x):
    print i

产生:

3600
1200
3600
300

哪些是正确的数字。

但是,当我这样称呼它时:

somefun(lengths(x))

其中somefun() 定义为:

def somefun(lengths):
    for length in lengths():  # <--- ERROR HERE
        if not is_blahblah(length): return False

我收到此错误消息:

TypeError: 'generator' object is not callable

我误会了什么?

【问题讨论】:

    标签: python generator yield


    【解决方案1】:

    您不需要调用您的生成器,删除 () 括号。

    你可能会因为你在函数中使用与生成器名称相同的名称而感到困惑;以下也将起作用:

    def somefun(lengen):
        for length in lengen:
            if not is_blahblah(length): return False
    

    然后将传递给somefun 函数的参数绑定到本地lengen 变量而不是lengths,以明确该本地变量与您在别处定义的lengths() 函数不同.

    【讨论】:

    • @AmigableClarkKant,首先将括号放在那里的逻辑是什么?
    • @unkulunkulu:可能与生成生成器的函数名称混淆。
    • @unkulunkulu - 逻辑?你问一个疯狂的、困惑的初学者关于逻辑的问题。 :)
    • @AmigableClarkKant, :) 逻辑对于初学者来说是一个很好的工具。我的意思是,函数的参数接近于“替换为”。因此,如果您将 lengths 参数替换为您提供给函数的参数 (lengths(x)),那么您将得到 for length in lengths(x)(): 行,看起来很奇怪吧 :)
    • @AmigableClarkKant,那么我们欢迎您来到 Python 的温暖之地,那里的逻辑工作正常,程序员很开心。
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多