Как я копирую ** kwargs в сам?

Есть ли способ, которым я могу определить __init__ так ключевые слова, определенные в **kwargs присвоены классу?

Например, если я должен был инициализировать a ValidationRule класс с ValidationRule(other='email'), значение для self.other должен быть добавлен к классу, не имея необходимость явно называть каждый возможный kwarg.

class ValidationRule:
    def __init__(self, **kwargs):
        # code to assign **kwargs to .self
16
задан Stevoisiak supports Monica 6 February 2018 в 19:38
поделиться

5 ответов

Возможно, это не самый чистый способ, но он работает:

class ValidationRule: 
    def __init__(self, **kwargs): 
        self.__dict__.update(kwargs)

Я думаю, что предпочитаю решение одного , потому что оно ограничивает доступные свойства чтобы уберечь вас от неприятностей, когда ваш ввод поступает из внешних источников.

15
ответ дан 30 November 2019 в 15:22
поделиться

Я думаю где-то в 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)

Этот класс будет принимать только аргументы с именами атрибутов из белого списка, перечисленных в __ allowed .

23
ответ дан 30 November 2019 в 15:22
поделиться
class ValidationRule:
   def __init__(self, **kwargs):
      self.__dict__.update(kwargs)
4
ответ дан 30 November 2019 в 15:22
поделиться

Вы можете установить аргументы kwargs , обновив атрибут __ dict __ экземпляра.

class ValidationRule:
   def __init__(self, **kwargs):
       self.__dict__.update(kwargs)
2
ответ дан 30 November 2019 в 15:22
поделиться

Вы можете сделать что-то вроде этого:

class ValidationRule:
   def __init__(self, **kwargs):
      for (k, v) in kwargs.items():
         setattr(self, k, v)
12
ответ дан 30 November 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: