首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setattr with kwargs,pythonic or not?

setattr with kwargs,pythonic or not?
EN

Stack Overflow用户
提问于 2009-04-11 06:31:19
回答 3查看 6.9K关注 0票数 19

我在一些有很多参数(最多20个)的SQLAlchemy ORM类中使用了这样的__init__()

代码语言:javascript
复制
def __init__(self, **kwargs):
    for k, v in kwargs.iteritems():
        setattr(self, k, v)

像这样设置属性是“pythonic式的”吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-11 11:04:10

是。另一种方法是。

代码语言:javascript
复制
def __init__(self, **kwargs):
    self.__dict__.update( kwargs )
票数 29
EN

Stack Overflow用户

发布于 2009-04-13 14:58:49

是的,如果没有更好的方法来提供参数的话。

例如,使用您提到的ORM类,也许允许..

代码语言:javascript
复制
col = Varchar()
col.index = True
col.length = 255

..rather than..

代码语言:javascript
复制
col = Varchar(index = True, length = 255)

好吧,这不是最好的例子,因为**kwargs方法实际上更好。但我的观点是,在使用像**kwargs这样有时不被鼓励的东西之前,你应该总是考虑实现某些东西的替代方法。

另一件要记住的事情是,您可能会丢失用户期望的行为,例如,如果用户提供了无效的关键字arg,则会引发TypeError,这可以像这样解决。

代码语言:javascript
复制
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)

最后要考虑的是:

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2009-04-11 06:49:44

对我来说,如果你只在代码中的一个地方需要它,那么它看起来就像是一条巨蟒。

下面的链接为同样的问题提供了一种更“通用”的方法(例如,使用装饰器和一些额外的功能),请查看:http://code.activestate.com/recipes/551763/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/739625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档