27

これを行うためのよりコンパクトで効率的な方法はありますか?

    for key in kwargs:
        if key == 'log':
            self.log = kwargs[key]
        elif key == 'bin':
            self.bin = kwargs[key]
        elif key == 'pid':
            self.pid = kwargs[key]
        elif key == 'conf':
            self.conf = kwargs[key]
4

7 に答える 7

48

あなたが求めたものを正確に達成するために、あなたは使用することができます

for key in ('log', 'bin', 'pid', 'conf'):
    if key in kwargs:
        setattr(self, key, kwargs[key])

また

self.__dict__.update((key, kwargs[key])
                     for key in ('log', 'bin', 'pid', 'conf')
                     if key in kwargs)

ただし、私は一般的に次のようなものを好みます。

def f(log=None, bin=None, pid=None, conf=None):
    self.log = log
    self.bin = bin
    self.pid = pid
    self.conf = conf

これはまだ幾分反復的ですが、コードは非常に読みやすいです。対応するキーワード引数が渡されるかどうかに関係なく、すべての属性が初期化され、関数のシグネチャは引数とそのデフォルトを明確に文書化します。

于 2011-04-11T17:12:50.207 に答える
27
self.log = kwargs.get('log', default_log)
self.bin = kwargs.get('bin', default_bin)
self.pid = kwargs.get('pid', default_pid)
self.conf = kwargs.get('conf', default_conf)

self.logこれには、どのような場合でも割り当てられる追加の利点がありAttributeErrorます (コードがめちゃくちゃに壊れていることを意味します。それ以上のことはありません。すべてが常に割り当てられていることを常に確認してください)。余分なself.log = default_log行なし。デフォルトの get は省略できますNone

于 2011-04-11T17:13:46.787 に答える
9

で提供されたキーがget()ディクショナリにない場合、結果は になりNoneます。

self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
于 2011-04-11T17:12:50.277 に答える
4
for k,v in kwarg.iteritems():
   setattr(self, k, v)

setattr(self, "bin", "val")呼び出しのようなものですself.bin = "val"

ただし、@Sven Marnach のようなホワイトリストがある方が望ましいです。

于 2011-04-11T17:14:42.000 に答える
2
for k,v in kw.items():
   setattr(self, k, v)
于 2011-04-11T17:12:44.660 に答える
0

self.__dict__.update(kwargs)

于 2011-04-11T17:13:13.233 に答える