Dataclass для игнорирования атрибута в asdict в Python

#python #tkinter #python-dataclasses

#python #tkinter #python-классы данных

Вопрос:

Я создаю проект Python Tkinter MVC с использованием классов данных, и я хотел бы создавать виджеты путем перебора словаря, созданного методом asdict (при передаче в представление через контроллер); однако есть атрибуты, которые я не хочу включать в набор виджетов. Перед этим редактированием я опубликовал нечто похожее на приведенный ниже класс (теперь это более специфично для проекта, над которым я работаю, спасибо @Prune, @Cameron_McFee и @Brian_McCutchon за их ответы). Есть ли способ исключить атрибуты из метода asdict? В приведенном ниже примере я не хочу включать «customer» в словарь.

Я попытался экспериментально включить две спецификации полей — repr=False и init=False для двух полей, но я предположил, что они не будут работать, и они этого не делают.

 @dataclass
class Product:
    name: str
    description: str = field(repr=False)
    N: float = field(init=False, default=0.0)
    P: float
    K: float
    _customer = None #class variable until assigned
    self._customer # but 'self' doesn't exist in this context.

    @property
    def customer(self):
        return self._customer

    @customer.setter
    def customer(self, value):
        self._customer = value
 

Я понимаю, что существуют разные способы построения класса для достижения этой цели, возможно, избегая классов данных, например:

 class Product:

    def __init__(self, name: str, description: str, N: float, P: float, K: float):
        self.name = name
        self.description = description
        self.N = N
        self.P = P
        self.K = K
        self._customer = None 

    @property
    def customer(self):
        return self._customer

    @customer.setter
    def customer(self, value):
        self._customer = value
 

Это включает в себя больше шаблонов, которых я хотел бы избежать, если это возможно. Несовершенной аналогией была бы модель на C #, экземпляр которой можно создать с помощью Dapper или EF.

Комментарии:

1. Почему вы спрашиваете нас, действительно ли это? Вы должны знать , прежде чем публиковать, поскольку это проверяемый элемент и, следовательно, выходит за рамки переполнения стека. «Pythonic» является самоуверенным, а также не по теме, если вы не можете указать на конкретную технику и объяснить свои опасения по этому поводу. В противном случае вы запрашиваете проверку кода — не на том сайте.

Ответ №1:

Из PEP 557:

Декоратор dataclass проверяет класс на поиск полей. Поле определяется как любая переменная, указанная в аннотациях. То есть переменная, имеющая аннотацию типа. За двумя исключениями, описанными ниже, ни один из механизмов класса данных не проверяет тип, указанный в аннотации.

Таким образом, это допустимый код python, но _dib переменная класса (или свойство dib) не будет включена в сгенерированные сравнительные методы, как _dib это не __annotations__

Комментарии:

1. Я думаю, что есть еще одна проблема: _dib в этом случае не будет переменной класса? Вероятно, это не то, чего хочет OP.

2. конечно, это тоже проблематично — но получатель должен возвращать переменную класса None, пока установщик не применит переменную экземпляра вместо нее, верно? Значит, он будет работать как переменная экземпляра с значением по умолчанию?