как игнорировать лишние kwargs в классе python -attrs - PullRequest
0 голосов
/ 30 января 2020

Например:

@attrs
class Foo:
  a = attrib()

f = Foo(a=1, b=2)

Приведенный выше код выдаст ошибку, поскольку класс Foo не имеет b атрибута. Но я хочу отбросить переданное b значение, как будто я только что позвонил f = Foo(a=1). В моем случае у меня есть dici c dict (который я хочу преобразовать в класс attr), и мне просто не нужны некоторые ключи.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Похоже, это больше вопрос сериализации / десериализации / проверки, и его аргументы довольно строги по многим причинам. Один из них - это набор текста (как в типах, а не нажатие клавиш :)), а другой - надежность / отладка. Игнорирование аргументов о том, что вы можете просто ошибиться, может привести к очень неприятным моментам. Такого рода вещи лучше перенести в отдельный слой.

Вы можете найти некоторые возможные инструменты для этого в https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs.

0 голосов
/ 30 января 2020
class FromDictMixin:
    @classmethod
    def from_dict(cls, data: dict):
        return cls(**{
            a.name: data[a.name]
            for a in cls.__attrs_attrs__
        })

@attrs
class Foo(FromDictMixin):
    a = attrib()

Работает, но выглядит некрасиво. Я прыгал, что у attrs lib было готовое решение.

...