Python3 | Aggiungi decoratore alla voce enum [duplicato]

Nov 18 2020

Quindi, ho una libreria che può leggere un certo file (il layout del file è fuori dal mio controllo). Questi file hanno versioni e con ogni versione vengono aggiunte più funzionalità. Ho Enum che rappresentano alcune caratteristiche. Ora con l'ultimo aggiornamento, le nuove voci dovrebbero essere aggiunte a Enum. Tuttavia, voglio essere in grado di fornire all'utente un avviso (o un'eccezione) quando tenta di utilizzare funzionalità più recenti nelle versioni precedenti.

Ho pensato che i decoratori potessero essere la strada da percorrere, contrassegnando determinati valori e funzioni come: @from_version('1.40')o qualcosa del genere. Non ho mai creato i miei decoratori, quindi non li conosco molto bene.

Un ultimo problema con questo, la versione del file non è disponibile a livello globale. (Non posso aggiungere qualcosa di statico perché più file dovrebbero essere in grado di essere aperti contemporaneamente). Quindi non sono nemmeno sicuro che i decoratori siano la strada da percorrere.

Ora ho provato ad aggiungere un decoratore a una voce Enum, ma non ha funzionato:

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

Quindi mi chiedo come posso aggiungerlo a un'enumerazione, ho anche provato ad aggiungere una proprietà in un'enumerazione in modo da poter aggiungere il decoratore a quella, ma anche l'aggiunta della proprietà non ha funzionato ...

TL; DR

Come aggiungo il mio decoratore a una voce enum specifica? Mi aspettavo che assomigliasse a questo:

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

Grazie in anticipo per qualsiasi aiuto!

Risposte

1 EthanFurman Nov 19 2020 at 04:24

Quello che vuoi è in una risposta separata, ma per spiegare il problema che stai riscontrando - i decoratori sono utilizzabili solo con funzioni e classi ( defe class) e non possono essere usati con attributi (cose come ABC = 1.