Як визначити властивості Python Enum, якщо значення MySQL ENUM мають простір у своїх іменах?


10

У мене Enumклас Python такий:

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

У базі даних MYSQL у стовпці ENUM присвоєно значення "Intern", "Junior Engineer", "Medior Engineer", "Senior Engineer".

Проблема в тому, що я отримую помилку:

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

Ця помилка сталася, коли я викликаю запит на зразок:

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

seniorityє властивістю enum в UserPropertyмоделі.

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

Для цього класу я визначив клас схеми за допомогою marshmallow Schemaта EnumFieldз marshmallow_enumпакету:

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

Що робити у цій ситуації, оскільки я не можу визначити ім'я властивості класу python з простором. Як змусити python використовувати значення визначених властивостей замість імен властивостей?


2
подивіться, чи це допомагає notinventedhere.org/articles/python/…
Шенанігатор,

Відповіді:


3

Як зазначив Шенанігатор у коментарі мого питання, ми можемо використовувати псевдоніми для вирішення цієї проблеми.

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

У списку багато емблематичних імен (осіб), пов’язаних з одним із своєрідних, стійких якостей. Всередині специфікації особи можуть переглядатись за характером, а сам рахунок можна переглядати.

Зміст модуля

Цей модуль характеризує чотири класи специфікацій, які можна використовувати для характеристики чудових розташувань імен та якостей: Enum, IntEnum, Flag та IntFlag. Це також характеризує одного декоратора, одного з видів () і одного помічника, авто.

enum.Enum

Базовий клас для виготовлення перелічених констант. Дивіться сегментний функціональний API для іншої граматики розвитку.

клас enum.IntEnum

Базовий клас для створення перерахованих констант, які додатково є підкласами int.

enum.IntFlag

Базовий клас для створення перерахованих констант, які можна консолідувати, використовуючи розрядні адміністратори, не втрачаючи участі в IntFlag. Особи IntFlag додатково є підкласами int.

enum.Flag

Базовий клас для створення перерахованих констант, які можна консолідувати за допомогою бітових завдань, не втрачаючи при реєстрації прапора.

enum.unique ()

Декоратор класу Enum, який гарантує лише одне ім’я, прив’язаний до будь-якого, що варто.

клас enum.auto

Приклади заміщені відповідним стимулом для людей Enum. Початок варто в 1.

Новий у варіанті 3.6: Прапор, IntFlag, a

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.