ホームページ  >  記事  >  バックエンド開発  >  Python の列挙型

Python の列挙型

高洛峰
高洛峰オリジナル
2016-11-22 17:13:541466ブラウズ

列挙型はラベルまたは定数のコレクションとみなすことができ、通常は曜日、月、ステータスなどの特定の限定されたコレクションを表すために使用されます。 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 のソース コードを読むか、次のいくつかの記事の内容に注目してください。 !

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。