以Pythonic方式操纵大量关键字参数

以Pythonic方式操纵大量关键字参数,python,dictionary,key,keyword-argument,Python,Dictionary,Key,Keyword Argument,我有一个类,它的init函数需要很多关键字参数。我希望能够基本上重写这段代码,使它的语法更清晰(不太难编码)。最好我能够得到它,这样只需将关键字参数添加到\u init\u即可分别更改null函数中的所有属性/参数 class Class : def __init__ (self, kw0=0, kw1=1, kw2=2) : ''' The keyword arguments as strings. ''' self.Keys = ['kw0', '

我有一个类,它的init函数需要很多关键字参数。我希望能够基本上重写这段代码,使它的语法更清晰(不太难编码)。最好我能够得到它,这样只需将关键字参数添加到\u init\u即可分别更改null函数中的所有属性/参数

class Class :

    def __init__ (self, kw0=0, kw1=1, kw2=2) :

        ''' The keyword arguments as strings. '''
        self.Keys = ['kw0', 'kw1', 'kw2']

        ''' Their values. '''
        self.Values = [kw0, kw1, kw2]

        ''' A dictionary made from the keys and values. '''
        self.Dict = self.make_dict()

        ''' As individual attributes, '''
        self.KW0, self.KW1, self.KW2 = self.Values

    def make_dict (self) :
        ''' Makes a dictionary '''

        keys   = self.Keys
        values = self.Values

        _dict = {}
        for i in xrange(len(keys)) :
            key   = keys[i]
            value = values[i]

            _dict[key] = value

        return _dict

    def null (self, kw0=None, kw1=None, kw2=None) :
        ''' The same keyword arguments as **__init__** but they all default
            to **None**. '''

        pass

c = Class()
print c.Keys
print c.Values
print c.Dict
print c.KW0
print c.KW1
print c.KW2

这是我喜欢python的一点。在您的
\uuuu init\uuuu

def __init__ (self, **kwargs):
    self.__dict__.update(kwargs)
将在字典
kwargs
中定义的成员追加为类的成员


编辑-为了反映**kwargs的正确语法,用update()代替append()

这是我喜欢python的一点。在您的
\uuuu init\uuuu

def __init__ (self, **kwargs):
    self.__dict__.update(kwargs)
将在字典
kwargs
中定义的成员追加为类的成员


已编辑-为了反映**kwargs的正确语法,请使用update()而不是append()

为什么不接受任何关键字参数。可以对允许的关键字名称及其默认值使用class属性

class Class(object):

     _defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!")

     def __init__(self, **kwargs):

        # Raise exception if any non-supported keywords supplied
        if set(kwargs.keys()) - set(self._defaults.keys()):
            raise KeyError("unsupported keyword argument")

        # Update our instance with defaults, then keyword args
        self.__dict__.update(self._defaults)
        self.__dict__.update(kwargs)
如果您希望在多个方法中使用相同的功能(例如
\uuu init\uuu()
null()
),则只需将处理代码的参数分解为自己的方法,并从两个位置调用它即可

一个缺点是
help()
和其他Python文档工具不会显示允许的关键字参数,因为它们不在方法签名中


顺便说一句,我不太清楚为什么要分别存储键和值。只需将它们存储为字典,然后在需要时使用字典的
.keys()
.values()
方法获取键或值。

为什么不接受任何关键字参数。可以对允许的关键字名称及其默认值使用class属性

class Class(object):

     _defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!")

     def __init__(self, **kwargs):

        # Raise exception if any non-supported keywords supplied
        if set(kwargs.keys()) - set(self._defaults.keys()):
            raise KeyError("unsupported keyword argument")

        # Update our instance with defaults, then keyword args
        self.__dict__.update(self._defaults)
        self.__dict__.update(kwargs)
如果您希望在多个方法中使用相同的功能(例如
\uuu init\uuu()
null()
),则只需将处理代码的参数分解为自己的方法,并从两个位置调用它即可

一个缺点是
help()
和其他Python文档工具不会显示允许的关键字参数,因为它们不在方法签名中

顺便说一句,我不太清楚为什么要分别存储键和值。只需将它们存储为字典,然后在需要时使用字典的
.keys()
.values()
方法获取键或值。

此外,也可以使用Python 2.5以下版本中的
defaultdict
方法。哦,还有@serotonin:你忘了在函数定义中的
kwargs
之前加上
**
,这样在调用函数时就可以将值作为
keyword=value
对输入,而不必传递实际的
dict
。这通常是个坏主意(尽管在某些情况下可以)。它将绕过属性和
\uuuuuuuuuuuuuuuuu
之类的内容!考虑下面的例子:在2.5以下的Python版本中,也可以使用<代码> Debug语句>代码>配方。哦,还有@serotonin:你忘了在函数定义中的
kwargs
之前加上
**
,这样在调用函数时就可以将值作为
keyword=value
对输入,而不必传递实际的
dict
。这通常是个坏主意(尽管在某些情况下可以)。它将绕过属性和
\uuuuuuuuuuuuuuuuu
之类的内容!考虑下面的例子: