2009-04-11 24 views
15

我在那有許多參數(截至20)一些SQLAlchemy的ORM類中使用__init__()這樣。setattr與kwargs,pythonic與否?

def __init__(self, **kwargs): 
    for k, v in kwargs.iteritems(): 
     setattr(self, k, v) 

設置這樣的屬性是「pythonic」嗎?

回答

19

是。另一種做法是。

def __init__(self, **kwargs): 
    self.__dict__.update(kwargs) 
+5

這一個比問題中的版本短,但請記住它不適用於屬性(或其他描述符)的屬性。 – 2009-04-12 00:52:06

+0

我不推薦這樣做。有時會遇到一些錯誤。當更新`__dict__`內建屬性。 – 2017-07-10 08:58:13

1

對我來說似乎很Python的,如果你只需要在這個代碼中的一個地方。

下面的鏈接提供了一種更「通用」的做法同樣的問題(例如,用一個裝飾和一些額外的功能),看看:http://code.activestate.com/recipes/551763/

4

是的,如果沒有「更好的」方式提供參數。

例如,使用ORM類你提到,也許這將是更Python'y允許..

col = Varchar() 
col.index = True 
col.length = 255 

比.. ..rather

col = Varchar(index = True, length = 255) 

好吧,這不是最好的例子,因爲**kwargs方法實際上是更好的..但我的觀點是,你應該考慮實現的東西,使用像**kwargs有時,沮喪的事情之前的替代方法..

另一件事要記住的是,你可能會失去行爲用戶期望,例如,如果用戶提供一個非法的關鍵字ARG,這可能是周圍的工作就像養一個TypeError ..

def __init__(self, **kwargs): 
    valid_kwargs = ['x', 'y', 'z'] 
    for k, v in kwargs.iteritems(): 
     if k not in valid_kwargs: 
      raise TypeError("Invalid keyword argument %s" % k) 
     setattr(self, k, v) 

最後的事情考慮:

class Hmm: 
    def __init__(self, **kwargs): 
     for k, v in kwargs.iteritems(): 
      setattr(self, k, v) 
    def mymethod(self): 
     print "mymethod should print this message.." 

x = Hmm(mymethod = None) 
x.mymethod() # raises TypeError: 'NoneType' object is not callable 
相關問題