Come definire le proprietà di Python Enum se i valori ENUM di MySQL hanno spazio nei loro nomi?


10

Ho Enumclasse Python in questo modo:

from enum import Enum
class Seniority(Enum):
    Intern = "Intern"
    Junior_Engineer = "Junior Engineer"
    Medior_Engineer = "Medior Engineer"
    Senior_Engineer = "Senior Engineer"

Nel database MYSQL, la colonna ENUM di anzianità ha i valori "Stagista", "Ingegnere junior", "Ingegnere medior", "Ingegnere senior".

Il problema è che ottengo un errore:

LookupError: "Junior Engineer" is not among the defined enum values

Questo errore si è verificato quando chiamo query come:

UserProperty.query.filter_by(full_name='John Doe').first()

seniorityè una proprietà enum nel UserPropertymodello.

class UserProperty(db.Model):
   ...
   seniority = db.Column(db.Enum(Seniority), nullable=True)
   ...

Per questa classe ho definito la classe Schema usando marshmallow Schemae EnumFielddal marshmallow_enumpacchetto:

class UserPropertySchema(Schema):
    ...
    seniority = EnumField(Seniority, by_value=True)
    ...

Cosa fare in questa situazione, perché non riesco a definire il nome della proprietà della classe Python con spazio. Come forzare Python a utilizzare i valori delle proprietà definite anziché i nomi delle proprietà?


Risposte:


3

Come ha affermato Shenanigator nel commento della mia domanda, possiamo usare gli alias per risolvere questo problema.

Seniority = Enum(
    value='Seniority',
    names=[
        ('Intern', 'Intern'),

        ('Junior Engineer', 'Junior Engineer'),
        ('Junior_Engineer', 'Junior_Engineer'),

        ('Medior Engineer', 'Medior Engineer'),
        ('Medior_Engineer', 'Medior_Engineer'),

        ('Senior Engineer', 'Senior Engineer'),
        ('Senior_Engineer', 'Senior_Engineer')
    ]
)

2

Un elenco contiene molti nomi emblematici (individui) legati a qualità uniche e costanti. All'interno di una specifica, gli individui possono essere esaminati per carattere e il conteggio stesso può essere ripetuto.

Contenuto del modulo

Questo modulo caratterizza quattro classi di specifiche che possono essere utilizzate per caratterizzare disposizioni straordinarie di nomi e qualità: Enum, IntEnum, Flag e IntFlag. Allo stesso modo caratterizza un decoratore, unico nel suo genere () e un aiutante, auto.

classe enum.Enum

Classe base per la creazione di costanti elencate. Vedi segmento API funzionale per un'altra grammatica di sviluppo.

class enum.IntEnum

Classe base per la creazione di costanti elencate che sono anche sottoclassi di int.

class enum.IntFlag

Classe base per la creazione di costanti elencate che possono essere consolidate utilizzando gli amministratori bit a bit senza perdere la loro partecipazione a IntFlag. Gli individui IntFlag sono inoltre sottoclassi di int.

classe enum.Flag

Classe di base per la creazione di costanti elencate che possono essere consolidate utilizzando le attività bit a bit senza perdere la loro registrazione Flag.

enum.unique ()

Il decoratore di classe Enum che garantisce che un solo nome è legato a uno qualsiasi vale.

classe enum.auto

Gli esempi vengono sostituiti con un incentivo adeguato per gli individui Enum. Iniziare vale la pena iniziare a 1.

Novità nella variante 3.6: Flag, IntFlag, a

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.