Python3 | Добавить декоратор в запись перечисления [дубликат]

Nov 18 2020

Итак, у меня есть библиотека, которая может читать определенный файл (макет файла находится вне моего контроля). У этих файлов есть версии, и с каждой версией добавляются новые функции. У меня есть перечисления, которые представляют некоторые функции. Теперь с последним обновлением в Enum должны быть добавлены новые записи. Но я хочу иметь возможность выдавать пользователю предупреждение (или исключение), когда он пытается использовать новые функции в старых версиях.

Я подумал, что декораторы могут быть подходящим вариантом, помечающим определенные значения и функции, например: @from_version('1.40')или что-то в этом роде. Я никогда не создавал собственных декораторов, поэтому я не слишком хорошо с ними знаком.

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

Теперь я попытался добавить декоратор к записи Enum, но это не сработало:

import enum
>>> def hello_world(f):
...     def decorated(*args, **kwargs):
...         print('Hello World!')
...     return decorated
... 
>>> class A(enum.Enum):
...     @hello_world()  # Tried with and without ()
...     ABC = 1
  File "<input>", line 3
    ABC = 1
    ^
SyntaxError: invalid syntax

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

TL; DR

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

class EnumClass(Enum):
    @from_version('1.40')
    ENTRY = 0

Заранее благодарю за любую помощь!

Ответы

1 EthanFurman Nov 19 2020 at 04:24

Что вы хотите в отдельном ответе, но объяснить проблему вы имеете - декораторы могут использоваться только с функциями и классами ( defа class) и не могут быть использованы с атрибутами ( такими вещами , как ABC = 1.