enum-文字列変換でenumの値を取得する


108

以下の列挙型が定義されています

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

今、印刷された値は

D.x

代わりに私は列挙型の値を印刷したかった

1

この機能を実現するために何ができるでしょうか?


1
アクセスパラメータを明確にする必要があります。Dxvalueのことはわかっています。値を返すためのDx文字列変換が必要です。質問で条件が明確にならない場合は申し訳ありません。
Vaibhav Mishra 2014年

回答:


188

enum オブジェクトを印刷しています.value単に印刷したい場合は、属性を使用します。

print(D.x.value)

参照してください。列挙メンバーとその属性へのプログラムによるアクセスのセクションを

enumメンバーがあり、その名前または値が必要な場合:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

__str__カスタム文字列表現を提供したいだけの場合は、列挙型にメソッドを追加できます。

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

デモ:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1

整数値と比較すると、オブジェクトとして返されます。例:if D.x == 10: ...。整数にはどのようなアプローチを取るべきですか?
アルパー

@alper:まったく同じ方法。D.xは列挙オブジェクトでD.x.value、整数値です。enum値を整数のように動作させる必要がある場合は、IntEnumtypeを使用します。各要素はのサブクラスでintあり、IntEnumD.x == 10機能します。
Martijn Pieters

私が追加されている def __eq__(self, other): return int(self.value) == otherdef __int__(self): return int(self.value)、まだ私が使用することを持っていると思う.value、私は比較使用していないときのケースで
アルパース

@alper:別の列挙値の__eq__場合、その実装は機能しませんotherD.x == D.yここで、D.x.value == D.y.value真となり、例えば失敗します。IntEnum代わりに使いたいようですEnum
Martijn Pieters

7

以下を使用してアクセスを実装しました

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

今私はただできる

print(D.x)1結果として取得します。

の代わりself.nameに印刷したい場合にも使用できます。x1


2
なぜ文字列は、書式設定とself._value_return str(self.value)より簡単です。
Martijn Pieters

1
私はソースを見て、これが実装された方法でしたが、あなたは正しく、self.valueクリーンです。
Vaibhav Mishra 2014年

3
シングルアンダースコア属性は、生成された列挙型クラスの内部にあります。ドキュメント化された属性(これは、特殊な記述子であるためvalue、列挙型の名前として引き続き使用できる)に固執してください。
Martijn Pieters

@MartijnPietersが合意
Vaibhav Mishra 14

0

Enum文字列を使用してへのアクセスを検索したところ、このページが見つかりました。私はこれがこの特定の質問で尋ねられていることではないことを知っていますが、タイトルはそれを「示唆」しています。

文字列を使用してEnumを取得するには、次の操作を実行できます。

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.