Создать подпись функции в Python из класса данныхPython

Программы на Python
Ответить
Anonymous
 Создать подпись функции в Python из класса данных

Сообщение Anonymous »

Я хочу иметь один файл, который определяет набор констант, чтобы мне не нужно было их жестко кодировать позже.
Например, я бы сделал это:

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

@dataclass(frozen=True)
class CONSTANTS:
STATUS_SUCCESS = 200
STATUS_ERROR = 400

SI_UNIT_MASS = "kg"
SI_UNIT_LENGTH = "m"
Теперь предположим, что у меня есть следующая функция:

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

def func():
something = True
if something:
return CONSTANTS.STATUS_SUCCESS
else:
return CONSTANTS.STATUS_ERROR

Мне хотелось бы иметь подсказки по типу для func.
Поэтому я подумал, что могу просто добавить это:

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

@dataclass(frozen=True)
class TYPES:
STATUS = Literal[CONSTANTS.STATUS_SUCCESS, CONSTANTS.STATUS_ERROR]
SI_UNIT = Literal[CONSTANTS.SI_UNIT_MASS, CONSTANTS.SI_UNIT_LENGTH]

и обновите сигнатуру функций:

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

def func() -> TYPES.STATUS:
Но здесь я получаю эту ошибку:

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

Variable not allowed in type expressionPylancereportInvalidTypeForm
Ошибка исчезает, когда я пишу:

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

@dataclass(frozen=True)
class TYPES:
STATUS = Literal[200, 400]
SI_UNIT = Literal["kg", "m"]
Но есть и обратная сторона: я могу забыть добавить к типу новую единицу измерения или код состояния. Мне бы хотелось, чтобы это было динамично, чтобы мне не приходилось повторяться.
Существует ли для этого стандартный подход?
Я также хотел бы переписать КОНСТАНТЫ так, как мне хотелось бы

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

@dataclass(frozen=True)
class CONSTANTS:
STATUS = STATUS
SI_UNIT = SI_UNIT
с

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

@dataclass(frozen=True)
class STATUS:
SUCCESS = 200
ERROR = 400

...
Поэтому я подумал, что, возможно, мне следует наследовать OPTIONS и STATUS от базового класса, который определяет что-то вроде свойства TYPE. Но я не могу найти пример, который бы казался естественным.


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

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

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

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

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

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