2011-04-11 83 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了。