1. ホーム
  2. python

[解決済み] Pythonで変数の引数(kwargs)からクラスの属性を設定するにはどうすればよいか

2022-04-27 17:27:47

質問

コンストラクタ(または他の関数)で可変数の引数を取り、それを条件付きでクラスの属性として設定するクラスがあるとします。

手動で設定することもできますが、pythonでは可変パラメータは十分一般的なので、これを行うための共通のイディオムがあるはずです。 しかし、私はこれを動的に行う方法がわかりません。

evalを使った例もありますが、それだと安全とは言えません。 ラムダを使うのがいいのでしょうか?

class Foo:
    def setAllManually(self, a=None, b=None, c=None):
        if a!=None: 
            self.a = a
        if b!=None:
            self.b = b
        if c!=None:
            self.c = c
    def setAllWithEval(self, **kwargs):
        for key in **kwargs:
            if kwargs[param] != None
                eval("self." + key + "=" + kwargs[param])

解決方法は?

を更新することができます。 __dict__ 属性 (インスタンスの属性を辞書形式で表したもの) にキーワード引数を指定します。

class Bar(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

であれば、可能です。

>>> bar = Bar(a=1, b=2)
>>> bar.a
1

というような内容で。

allowed_keys = {'a', 'b', 'c'}
self.__dict__.update((k, v) for k, v in kwargs.items() if k in allowed_keys)

を使えば、あらかじめキーをフィルタリングすることができます。 iteritems 代わりに items もしまだPython 2.xを使用しているならば)。