Python の列挙型

高洛峰
リリース: 2016-11-22 17:13:54
オリジナル
1493 人が閲覧しました

列挙型はラベルまたは定数のコレクションとみなすことができ、通常は曜日、月、ステータスなどの特定の限定されたコレクションを表すために使用されます。 Python のネイティブ型 (組み込み型) には特別な列挙型はありませんが、辞書、クラスなどの多くのメソッドを通じて実装できます。

WEEKDAY = {
    'MON': 1,
    'TUS': 2,
    'WEN': 3,
    'THU': 4,
    'FRI': 5
}
class Color:
    RED   = 0
    GREEN = 1
    BLUE  = 2
ログイン後にコピー

上記 2 つのメソッドは、単純な列挙型とみなすことができます。 、そのような列挙型変数がローカル スコープでのみ使用される場合は問題ありませんが、問題はそれらがすべて変更可能であることです。つまり、他の場所で変更され、通常の使用に影響を与える可能性があります。インスタンス化されて意味のないものになることもあります:

WEEKDAY['MON'] = WEEKDAY['FRI']print(WEEKDAY)
{'FRI': 5, 'TUS':
ログイン後にコピー
{'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4}
ログイン後にコピー

もちろん、タプルなどの不変型 (immutable) を使用することもできますが、これでは列挙型の本来の目的が失われ、ラベルが劣化します。 意味のない変数の場合:

c = Color()
print(c.RED)
Color.RED = 2
print(c.RED)
ログイン後にコピー
0
2
ログイン後にコピー

より良いソリューションを提供するために、Python は PEP 435 を通じてバージョン 3.4 に enum 標準ライブラリを追加しました。3.4 より前のバージョンでは、pip install enum を通じて互換性のあるサポートされるライブラリをダウンロードすることもできます。 enum は、Enum/IntEnum/unique の 3 つのツールを提供します。使用方法は非常に簡単です。Enum/IntEnum を継承することで列挙型を定義できます。ここで、IntEnum は列挙メンバーを整数型 (または整数型に変換できる) に制限し、一意の型に制限します。メソッドは次のように使用できます。 デコレータは列挙型メンバーの値を反復不可能に制限します:

COLOR = ('R', 'G', 'B')
print(COLOR[0], COLOR[1], COLOR[2])
ログイン後にコピー
R G B
ログイン後にコピー
from enum import Enum, IntEnum, uniquetry:    @unique
    class WEEKDAY(Enum):
        MON = 1
        TUS = 2
        WEN = 3
        THU = 4
        FRI = 1except ValueError as e:
    print(e)
ログイン後にコピー
duplicate values found in <enum &#39;WEEKDAY&#39;>: FRI -> MON
ログイン後にコピー

さらに興味深いのは、Enum のメンバーはすべてシングルトン (Singleton) であり、インスタンス化または変更できないことです:

try:    class Color(IntEnum):
        RED   = 0
        GREEN = 1
        BLUE  = &#39;b&#39;except ValueError as e:
    print(e)
ログイン後にコピー
invalid literal for int() with base 10: &#39;b&#39;
ログイン後にコピー
class Color(Enum):
    R = 0
    G = 1
    B = 2
ログイン後にコピー

インスタンス化はできませんが、列挙は可能です。 メンバーは変数に割り当てられます:

try:
    Color.R = 2except AttributeError as e:
    print(e)
ログイン後にコピー
Cannot reassign members.
ログイン後にコピー

比較や判断もできます:

red = Color(0)
green = Color(1)
blue = Color(2)
print(red, green, blue)
ログイン後にコピー
Color.R Color.G Color.B
ログイン後にコピー

最後の点、列挙メンバー自体も列挙型であるため、次の方法で他のメンバーを見つけることもできます。列挙型メンバー:

print(red is Color.R)
print(red == Color.R)
print(red is blue)
print(green != Color.B)
print(red == 0) # 不等于任何非本枚举类的值
ログイン後にコピー
True
True
False
True
False
ログイン後にコピー

ただし、これを使用する場合は注意してください。 機能は、メンバーの元の名前空間の名前と競合する可能性があるためです:

print(red.B)
print(red.B.G.R)
ログイン後にコピー
Color.B
Color.R
ログイン後にコピー

概要

enum モジュールの使用法は非常に単純で、関数は非常に明確ですが、その実装は学ぶ価値があります。 Python のクラスとメタクラスの黒魔術について詳しく知りたいが、どのように始めればよいかわからない場合は、enum のソース コードを読むか、次のいくつかの記事の内容に注目してください。 !

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート