回答:
この機能はすでにEnum [1]に組み込まれています。
>>> from enum import Enum
>>> class Build(Enum):
... debug = 200
... build = 400
...
>>> Build['debug']
<Build.debug: 200>
[1]公式ドキュメント: Enum programmatic access
Enum
は付属していませんが、.get()
必要に応じて追加したり、基本Enum
クラスを作成して常にそれから継承したりできます。
Build('debug')
Build('debug')
。クラスのコンストラクタは取らなければならない値を、すなわち、200
または400
この例では。名前を渡すには、答えがすでに述べているように、角括弧を使用する必要があります。
別の代替方法(特に、文字列が列挙型のケースに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')
def custom_enum(typename, items_dict):
class_definition = """
from enum import Enum
class {}(Enum):
{}""".format(typename, '\n '.join(['{} = {}'.format(k, v) for k, v in items_dict.items()]))
namespace = dict(__name__='enum_%s' % typename)
exec(class_definition, namespace)
result = namespace[typename]
result._source = class_definition
return result
MyEnum = custom_enum('MyEnum', {'a': 123, 'b': 321})
print(MyEnum.a, MyEnum.b)
または、文字列を既知の列挙型に変換する必要がありますか?
class MyEnum(Enum):
a = 'aaa'
b = 123
print(MyEnum('aaa'), MyEnum(123))
または:
class BuildType(Enum):
debug = 200
release = 400
print(BuildType.__dict__['debug'])
print(eval('BuildType.debug'))
print(type(eval('BuildType.debug')))
print(eval(BuildType.__name__ + '.debug')) # for work with code refactoring
debug
なの列挙型に文字列を: python class BuildType(Enum): debug = 200 release = 400
__dict__
と同じを使用していgetattr
ますか?内部Python属性との名前の衝突について心配しています...
getattr
です。名前の衝突の理由はわかりません。クラスのフィールドとしてキーワードを設定することはできません。
問題に対する私のJavaのような解決策。それが誰かを助けることを願っています...
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.upper():
return mm
sim = SignInMethod.value_of('EMAIL')
print("""TEST
1). {0}
2). {1}
3). {2}
""".format(sim, sim.name, isinstance(sim, SignInMethod)))
@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
私はこれがpython 3.6では機能しないことを通知したいだけです
class MyEnum(Enum):
a = 'aaa'
b = 123
print(MyEnum('aaa'), MyEnum(123))
このようなタプルとしてデータを与える必要があります
MyEnum(('aaa',))
編集:これは誤りであることが判明しました。私の間違いを指摘したコメント投稿者の功績
,
(要素がリストであるかのように)誤って各要素の後に(カンマ)を置いた場合、それは各要素をタプルとして扱います。(つまりa = 'aaa',
、実際にはと同じですa = ('aaa',)
)
,
、値を何らかの方法でタプルに変換する列挙型を定義するときに、すべての行を
Build.get('illegal', Build.debug)
何か?