3

オブジェクト名の文字列の最後にオブジェクトが必要だとしましょう: 文字列の例は で'first_class.second_class.third_class.id'、文字列のリストはすべて の形式を取ります'X1object.X2object...XNobject.what_you_want_is_here_object'

いずれの場合も、特定の名前に関係なく、X1 オブジェクトのアクティブなインスタンスがあることがわかります。例の文字列では、コードは既に のインスタンスを呼び出していますfirst_class。でロードでき、一般的にfirst_classはでロードできます。globals['first_class']X1objectglobals['X1object']

必要なのは、文字列の最後にあるオブジェクト (通常は値) です。したがって、文字列の例では、 の値が必要ですid = first_class.second_class.third_class.id。終了オブジェクトをフェッチするように文字列を変換する簡単な方法はありますか?

以下は、この問題を処理するために作成したコードですが、最後の属性が見つかるまで各属性を順番にフェッチするという力ずくのアプローチのようです。

first_class = FirstClass()
first_class = go_do_something_wild_in_first_class(first_class)
...

attribute = 'first_class.second_class.third_class.id'
attribute_pieces = attribute.split('.')

fetch_attribute = lambda attribute, name: \
    attribute[name] if attribute == globals() else \
    getattr(attribute, name)

for name in attribute_pieces: # I changed the code from using an index to using a name
    if name == attribute_pieces[0]:
        attribute = fetch_attribute(globals(), name)
    else:
        attribute = fetch_attribute(attribute, name)

id = attribute
4

3 に答える 3

4

使用できますreduce()

def resolve_object(name):
    names = name.split('.')
    return reduce(getattr, names[1:], globals()[names[0]])

ここでは、単にnames[0]グローバルとして検索し、残りの名前をループして、getattrこれまでの結果に対して for each を実行します。

デモ:

>>> class Foo(object): pass
... 
>>> first_class = Foo()
>>> first_class.second_class = Foo()
>>> first_class.second_class.third_class = Foo
>>> first_class.second_class.third_class.id = 'baz'
>>> resolve_object('first_class.second_class.third_class.id')
'baz'
于 2013-03-05T16:36:27.083 に答える
1

まさにあなたが望むことを行う zope.dottedname と呼ばれる Python ライブラリがあります:

https://pypi.python.org/pypi/zope.dottedname

オブジェクトの属性を含む、任意の文字列を Python 名前空間内の対応するオブジェクトに解決します。

于 2013-03-05T16:29:39.420 に答える
1

importlibを使用する必要があります

attribute = 'first_class.second_class.third_class.id'
attribute_pieces = attribute.split('.')

id = getattr(importlib.import_module('.'.join(attribute_pieces[:-1]), attribute_pieces[-1])
于 2013-03-05T16:35:25.753 に答える