4

我正在尝试使用 Python 的 getattr() 从我从无法控制的各种 API 获得的许多对象中提取数据。我的想法是通过一个异质对象列表并尝试对它们进行 getattr() 直到我提取出我需要的所有内容。

所以我正在做其中之一:

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>

问题:有没有一种方法可以说“当它是数据成员时访问数据成员,或者当它是函数时​​调用函数”来从这些东西中取出值?似乎使用 Python 应该很容易,但我找不到它。

4

3 回答 3

5
if hasattr(value, '__call__'):
    value = value()

备用:

if callable(value):
    value = value()

还:

import types
if isinstance(value, types.GeneratorType):
    # Handle generator case
于 2012-06-19T15:00:58.380 回答
4

使用callable功能:

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

在 Python 3 中,使用isinstance(obj, collections.Callable)import collections当然是在 之后)。此外,它似乎callable是在 Python 3.2 中添加回来的。

于 2012-06-19T15:04:49.593 回答
3

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

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)
于 2012-06-19T14:59:28.153 回答