我正在尝试使用生成器
在我的代码中使用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])
答案 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可以帮助避免您正在做的很多事情。