python - पाइथन में स्ट्रिंग को एनम में बदलें




string serialization (4)

मुझे आश्चर्य है कि पायथन के एनम वर्ग के लिए एक स्ट्रिंग को परिवर्तित करने (डिसेरराइजिंग) का सही तरीका क्या है। getattr(YourEnumType, str) जैसा लगता है कि यह काम करता है, लेकिन मुझे यकीन नहीं है कि यह पर्याप्त सुरक्षित है।

बस अधिक विशिष्ट होने के लिए, मैं 'debug' स्ट्रिंग को एनम ऑब्जेक्ट में इस तरह बदलना चाहता हूं:

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

@Rogueleaderr के उत्तर में सुधार:

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

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

एक अन्य विकल्प (विशेष रूप से उपयोगी है यदि आपके तार 1-1 को आपके staticmethod मामलों में मैप नहीं करते हैं) तो अपने staticmethod लिए एक staticmethod जोड़ना है, जैसे:

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') कर सकते हैं


यह कार्यक्षमता पहले से ही Enum [1] में बनाई गई है:

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

[१] आधिकारिक डॉक्स: Enum programmatic access


समस्या का मेरा जावा जैसा समाधान। आशा है कि यह किसी की मदद करता है ...

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)))






type-conversion