代码之家  ›  专栏  ›  技术社区  ›  Imran

塞塔特和夸格斯、蟒蛇还有没有?

  •  17
  • Imran  · 技术社区  · 15 年前

    我在用 __init__() 在一些具有许多参数(最多20个)的sqlAlchemy ORM类中,就是这样。

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

    像这样设置属性是“蟒蛇”吗?

    3 回复  |  直到 15 年前
        1
  •  23
  •   S.Lott    15 年前

    对。另一种方法是。

    def __init__(self, **kwargs):
        self.__dict__.update( kwargs )
    
        2
  •  8
  •   dbr    15 年前

    是的,如果没有更好的方式来提供论点的话。

    例如,使用您提到的ORM类,也许会允许更多的python'y。

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

    …而不是…

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

    好吧,这不是最好的例子,因为 **kwargs 方法实际上会更好。但我的观点是,在使用有时令人沮丧的东西,比如 *克沃斯

    要记住的另一件事是,您可能会失去用户期望的行为,例如,如果用户提供了一个无效的关键字arg(可以像这样工作),则会引发类型错误。

    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
    
        3
  •  1
  •   ChristopheD    15 年前

    在我看来,如果你的代码中只需要在一个地方使用它,那就相当于蟒蛇了。

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