我在那有許多參數(截至20)一些SQLAlchemy的ORM類中使用__init__()
這樣。setattr與kwargs,pythonic與否?
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
設置這樣的屬性是「pythonic」嗎?
我在那有許多參數(截至20)一些SQLAlchemy的ORM類中使用__init__()
這樣。setattr與kwargs,pythonic與否?
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
設置這樣的屬性是「pythonic」嗎?
是。另一種做法是。
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
對我來說似乎很Python的,如果你只需要在這個代碼中的一個地方。
下面的鏈接提供了一種更「通用」的做法同樣的問題(例如,用一個裝飾和一些額外的功能),看看:http://code.activestate.com/recipes/551763/
是的,如果沒有「更好的」方式提供參數。
例如,使用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
這一個比問題中的版本短,但請記住它不適用於屬性(或其他描述符)的屬性。 – 2009-04-12 00:52:06
我不推薦這樣做。有時會遇到一些錯誤。當更新`__dict__`內建屬性。 – 2017-07-10 08:58:13