我如何将**kwargs复制到自己?

mpe*_*pen 16 python syntax constructor kwargs

有没有一种方法可以定义,__init__因此定义的关键字**kwargs被分配给类?

例如,如果我要初始化一个ValidationRuleValidationRule(other='email'),self.other则应将值添加到类中,而不必为每个可能的kwarg明确命名.

class ValidationRule:
    def __init__(self, **kwargs):
        # code to assign **kwargs to .self
Run Code Online (Sandbox Code Playgroud)

ony*_*ony 23

我认为在stackoverflow上的某个地方我见过这样的解决方案.无论如何它看起来像:

class ValidationRule:
    __allowed = ("other", "same", "different")
    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
            assert( k in self.__class__.__allowed )
            setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

此类仅接受列有白名单属性名称的参数__allowed.


Gab*_*abe 15

这可能不是最干净的方式,但它有效:

class ValidationRule: 
    def __init__(self, **kwargs): 
        self.__dict__.update(kwargs)
Run Code Online (Sandbox Code Playgroud)

我认为我更喜欢ony的解决方案,因为它限制了可用的属性,以便在输入来自外部源时避免麻烦.


sth*_*sth 12

你可以这样做:

class ValidationRule:
   def __init__(self, **kwargs):
      for (k, v) in kwargs.items():
         setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

  • 如果kwargs列表很长,您可能希望使用*iteritems()*而不是*items()*.为了您的目的,应该没问题. (2认同)