gettattr,python中的“属性必须是字符串”错误

时间:2012-05-27 15:15:16

标签: python typeerror getattr

我正在尝试使用生成器

在我的代码中使用getattr函数
li=[]
m=[method for method in dir(li) if callable(getattr(li,method))]
print getattr(li,(str(i) for i in m))

错误

TypeError: getattr(): attribute name must be string

如果我在i上使用字符串强制,那么为什么会出现此错误?

另外,如果我使用代码

li=[]
m=[method for method in dir(li) if callable(getattr(li,method))]
for i in range(10):
    print getattr(li,str(m[i]))

然后没有错误

我是python的新手,请原谅我,如果我犯了非常基本的错误,请有人详细说明错误。感谢

编辑:相同的原理适用于此代码(这是从Dive到python的一个示例)。在这里,做了同样的事情,那么为什么没有错误?

def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

1 个答案:

答案 0 :(得分:3)

好的,鉴于你的编辑,我已经改变了我的答案。你似乎期望发电机做一些不同于它们的事情。

您没有将生成器传递给函数,并且该函数对生成器生成的每个项目都有效,您循环生成器然后在循环内执行所需的函数。

但是,在这里你不需要生成器表达式 - 只需循环遍历列表 - 例如:

for method in m:
    print(getattr(li, method))

如果你确实想使用生成器表达式,那么你可以在这里使用它而不是首先构建列表:

for method in (method for method in dir(li) if callable(getattr(li, method))):
    print(getattr(li, method))

虽然请注意,对于您在此处尝试执行的操作,the inspect module可以帮助避免您正在做的很多事情。