Python: аккуратно распаковать аргументы init в переменные-члены

Рассмотрим пример класса ниже:

class Foo(object):
    def __init__(self, a=2, b=0, c=1, d=42):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

Есть ли чистый способ распаковать kwargs в переменные-члены? Возможно, этот пример тривиален, но представьте себе конструктор с 17 переменными-членами с длинными именами, такими как redundant_data_structure_that_we_should_probably_remove, Я в курсе setattr()Например, в этом другом вопросе, но я не хочу принимать **kwargs в конструкторе, то есть я хотел бы распаковать только определенные члены vars a, b, c, а также d,

1 ответ

Решение

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

К счастью, вам обычно это не нужно:

  • Если у вас есть 17 переменных-членов, переданных в __init__ Пришло время рефакторинга.
  • Если ваш класс - это всего лишь пространство имен / пакет данных, не используйте класс в первую очередь.

Если вы хотите поэкспериментировать с библиотеками, чтобы удалить это дублирование, посмотрите python-fields или чуть менее волшебным attrs,

Другие вопросы по тегам