Python3 | Adicionar decorador à entrada enum [duplicado]

Nov 18 2020

Então, eu tenho uma biblioteca que pode ler um determinado arquivo (o layout do arquivo está fora do meu controle). Esses arquivos têm versões e, a cada versão, mais recursos são adicionados. Eu tenho Enums que representam alguns recursos. Agora, com a atualização mais recente, novas entradas devem ser adicionadas ao Enum. Porém, quero ser capaz de dar ao usuário um aviso (ou exceção) quando ele tentar usar recursos mais novos em versões mais antigas.

Achei que decoradores podem ser a melhor opção, marcando certos valores e funções como: @from_version('1.40')ou algo parecido. Nunca criei meus próprios decoradores, então não estou muito familiarizado com eles.

Um problema final com isso, a versão do arquivo não está disponível globalmente. (Não posso adicionar algo estático porque vários arquivos devem ser abertos ao mesmo tempo). Portanto, nem tenho certeza se decoradores são o caminho a percorrer.

Tentei adicionar um decorador a uma entrada Enum, mas não funcionou:

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

Então, estou me perguntando como posso adicionar isso a um enum. Também tentei adicionar uma propriedade em um enum para poder adicionar o decorador a ela, mas mesmo adicionar a propriedade não funcionou ...

TL; DR

Como adiciono meu próprio decorador a uma entrada de enum específica? Eu esperava que fosse assim:

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

Agradecemos antecipadamente por qualquer ajuda!

Respostas

1 EthanFurman Nov 19 2020 at 04:24

O que você quer está em uma resposta separada, mas para explicar o problema que você está tendo - decoradores só podem ser usados ​​com funções e classes ( defe class) e não podem ser usados ​​com atributos (coisas como ABC = 1.