Является ли предоставление __call__ членам перечисления хорошей идеей?Python

Программы на Python
Ответить
Anonymous
 Является ли предоставление __call__ членам перечисления хорошей идеей?

Сообщение Anonymous »

Основные вопросы
Я заметил, что у меня есть следующие вопросы, на которые невозможно ответить при поиске в Интернете:
  • Хороша ли практика/идея сделать члены перечисления вызываемыми?
    (Обратите внимание, что я имею в виду члены, а не класс, эта идея хорошо документирована)
  • Если это хорошая идея, как сообщить об этом Pycharm (2025.3.3) что члены перечисления являются вызываемыми?
Причина вопросов:
В моем проекте я понял, что переписываю много одного и того же кода, просто чтобы преобразовать член перечисления в класс, который, помимо прочего, содержит этот член перечисления. Чтобы сократить количество строк кода, я подумал, что было бы здорово, если бы сами члены перечисления могли вызываться для выполнения повторяющихся задач преобразования.
Вот минимизированный рабочий пример того, что я описал:

Код: Выделить всё

from enum import Enum
from dataclasses import dataclass

@dataclass(frozen=True)
class TTypeDef:
ttype: TokenType
content: str

class TokenType(Enum):
FOO = "FOO"
BAR = "BAR"

def __call__(self, content):
return TTypeDef(self, content)

assert TokenType.FOO("foo") == TTypeDef(TokenType.FOO, "foo")
(В реальном примере имеет смысл не создавать экземпляр TTypeDef явно)
Однако PyCharm(2025.3.3) выдаст предупреждение, поскольку str не вызывается в TokenType.FOO("foo"), поскольку он его не получает, что вместо строкового значения будет экземпляр перечисления.
Это подвело меня к некоторым интернет-исследованиям, как избавиться от предупреждения. Результатом исследования было следующее: до меня ни у кого не было такой проблемы.
Это открывает вопрос: хорошая ли это идея?

Подробнее здесь: https://stackoverflow.com/questions/799 ... -good-idea
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»