Python getattr()成员或函数?

Python getattr()成员或函数?,python,Python,我正试图使用Python的getattr()从我从各种API中获取的大量对象中提取数据,而这些API是我无法控制的。我的想法是浏览一个异源对象列表,并尝试在它们上获取attr(),直到我取出所有需要的东西 所以我在做其中一个: if hasattr(o, required_field): value = getattr(o, required_field) result.append([required_field, value]) print 'found field'

我正试图使用Python的getattr()从我从各种API中获取的大量对象中提取数据,而这些API是我无法控制的。我的想法是浏览一个异源对象列表,并尝试在它们上获取attr(),直到我取出所有需要的东西

所以我在做其中一个:

if hasattr(o, required_field):
    value = getattr(o, required_field)
    result.append([required_field, value])
    print 'found field', field, 'for value', value
我的问题是,有时我处理的对象有object.data()和sometiems object.data来提取数据。有时这些对象实际上是生成器

所以偶尔我会得到这样的东西:

found field ValueOfRisk for value
CellBM:<Instrument:/limbo/WLA_YdgjTdK1XA2qOlm8cQ==>.ValueOfRisk>
为值找到了风险的字段值
CellBM:.ValueOfRick>

问:有没有一种方法可以说‘当数据成员是数据成员时访问该数据成员,或者当它是函数时调用该函数’,以从这些内容中提取值?Python似乎很容易做到这一点,但我找不到它。

假设调用该方法是安全的:

methods = []
properties = []

if hasattr(o,required_field):
  value = getattr(o,required_field)
  try:
     #see if this value is callable
     value()
     methods.append(value)
  except TypeError:
     #property is not a method
     properties.append(value)
备选方案:

if callable(value):
    value = value()
此外:

使用以下功能:

if hasattr(o, required_field):
    v = getattr(o, required_field):
    if not callable(v):
        print "found field", required_value, "for value", v

在Python3中,使用
isinstance(obj,collections.Callable)
(当然是在
导入集合之后)。另外,在Python3.2中添加了
callable

也许您正在寻找
callable
函数?它会告诉您是否可以调用该属性。@NolenRoyalty不是不推荐调用的吗?编辑:我猜不是。看到一篇这样的帖子,但是官方的2.7文档没有这样说。感谢大家的快速回复,我从你们的答案中学到了很多,并且我的东西都正常工作了。但只能选择一个“正确”的:(.当然,这假设你很乐意在那里打电话。这可能会有副作用,这意味着这不是一个可行的选择。@Lattyware耶,我将编辑以表示这一限制…只是在考虑duck打字。我实际上从其他答案中学到了一些新方法,好问题!如果你当时真的想打电话,这是选项。)imal解决方案——请求原谅,而不是许可。
import types
if isinstance(value, types.GeneratorType):
    # Handle generator case
if hasattr(o, required_field):
    v = getattr(o, required_field):
    if not callable(v):
        print "found field", required_value, "for value", v