python - لغة - مكتبة اكواد بايثون




تحويل السلسلة إلى التعداد في بيثون (4)

أتساءل ما هي الطريقة الصحيحة لتحويل (إلغاء تسلسل) سلسلة إلى فئة التعداد بيثون. يبدو أن getattr(YourEnumType, str) يقوم بالمهمة ، لكنني لست متأكدًا مما إذا كانت آمنة بدرجة كافية.

لكي أكون أكثر تحديدًا ، أود تحويل سلسلة 'debug' إلى كائن Enum كما يلي:

class BuildType(Enum):
    debug = 200
    release = 400

أريد فقط أن أبلغ هذا لا يعمل في بيثون 3.6

class MyEnum(Enum):
    a = 'aaa'
    b = 123

print(MyEnum('aaa'), MyEnum(123))

سوف تضطر إلى إعطاء البيانات كصورة مثل هذا

MyEnum(('aaa',))

تحرير: اتضح أن هذا خطأ. ائتمانات لأحد المعلقين للإشارة إلى خطأي


بلدي جافا تشبه الحل لهذه المشكلة. آمل أن يساعد شخص ما ...

from enum import Enum, auto


class SignInMethod(Enum):
    EMAIL = auto(),
    GOOGLE = auto()

    @staticmethod
    def value_of(value) -> Enum:
        for m, mm in SignInMethod.__members__.items():
            if m == value:
                return mm


sim = SignInMethod.value_of('EMAIL')
print("""TEST
1). {0}
2). {1}
3). {2}
""".format(sim, sim.name, isinstance(sim, SignInMethod)))

هذه الوظيفة مضمنة بالفعل في التعداد [1]:

>>> from enum import Enum
>>> class Build(Enum):
...   debug = 200
...   build = 400
... 
>>> Build['debug']
<Build.debug: 200>

[1] مستندات رسمية: Enum programmatic access


هناك بديل آخر (مفيد بشكل خاص إذا كانت staticmethod لا تعيّن 1-1 لحالات التعداد الخاصة بك) هو إضافة staticmethod إلى Enum الخاص بك ، على سبيل المثال:

class QuestionType(enum.Enum):
    MULTI_SELECT = "multi"
    SINGLE_SELECT = "single"

    @staticmethod
    def from_str(label):
        if label in ('single', 'singleSelect'):
            return QuestionType.SINGLE_SELECT
        elif label in ('multi', 'multiSelect'):
            return QuestionType.MULTI_SELECT
        else:
            raise NotImplementedError

بعد ذلك يمكنك أن تفعل question_type = QuestionType.from_str('singleSelect')





type-conversion