4

Pythonのgetattr()を使用して、制御していないさまざまなAPIから取得した多数のオブジェクトからデータを抽出しようとしています。私のアイデアは、異種オブジェクトのリストを調べて、必要なものをすべて引き出すまで、それらに対してgetattr()を試行することでした。

だから私はこれらの1つをやっています:

if hasattr(o, required_field):
    value = getattr(o, required_field)
    result.append([required_field, value])
    print 'found field', field, 'for value', value

私の問題は、私が扱っているオブジェクトにobject.data()とsometiemsobject.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また、Python3.2callableで追加されたようです。

于 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 に答える