質問

辞書から値をアンパックしてインスタンス変数に割り当てるために使用できる組み込み関数/演算子はありますか?

これは私がやろうとしていることです:

c = MyClass()
c.foo = 123
c.bar = 123

# c.foo == 123 and c.bar == 123


d = {'bar': 456}
c.update(d)

# c.foo == 123 and c.bar == 456

辞書 update()に似た何かで、別の辞書から値をロードしますが、プレーンオブジェクト/クラスインスタンス用ですか?

役に立ちましたか?

解決

dの項目をループ処理する別の方法もあります。これには、 c .__ dict __ に保存されるという前提がありません。これは常に正しいとは限りません。

d = {'bar': 456}
for key,value in d.items():
    setattr(c,key,value)

または myClass の一部として update メソッドを記述して、 c.update(d)が期待どおりに動作するようにすることができます。

def update(self,newdata):
    for key,value in newdata.items():
        setattr(self,key,value)

setattrのヘルプをご覧ください

setattr(...)
    setattr(object, name, value)
    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ''x.y = v''.

他のヒント

試しましたか

f.__dict__.update( b )

また、多分、dictのupdateメソッドの周りにラッパーがあるのが良いスタイルでしょう:

def update(self, b):
    self.__dict__.update(b)

PS:@ S.Lott の投稿にコメントしないで申し訳ありませんが、私は持っていませんまだ担当者。

次のことを試してください:

def to_object(my_object, my_dict):
    for key, value in my_dict.items():
        attr = getattr(my_object, key)
        if hasattr(attr, '__dict__'):
            to_object(attr, value)
        else:
            setattr(my_object, key, value)

obj = MyObject()
data = {'a': 1, 'b': 2}
to_object(obj, data)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top