2011-04-11 57 views
18

有没有更紧凑/更高效的方法?kwargs解析最佳实​​践

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] 

回答

32
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) 
+5

不错!可能更短的默认值:'键为(...):setattr(self,key,kwargs.get(key))' – pajton 2011-04-12 09:00:01

+0

@pajton:当然,但我尽量保持接近OP的代码尽可能。 – 2011-04-13 11:54:13

+0

@pajton为什么在你的建议中删除了kwargs中的if key:行?为什么不检查'如果键入kwargs'? – 2016-05-13 06:37:01

2
for k,v in kw.items(): 
    setattr(self, k, v) 
5

如果get()提供的关键并不在字典中的结果是None

self.log = kwargs.get('log') 
self.bin = kwargs.get('bin') 
self.pid = kwargs.get('pid') 
self.conf = kwargs.get('conf') 
1

self.__dict__.update(kwargs)

+0

这可能是非常危险的,并且是无论如何都是hacky。 – delnan 2011-04-11 17:14:42

21
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行。您可以省略默认值None

2
for k,v in kwarg.iteritems(): 
    setattr(self, k, v) 

在哪个setattr(self, "bin", "val")是像呼叫self.bin = "val"

然而,更理想的是具有白名单等@Sven Marnach了。