2016-11-17 6 views
2

Why are mutable values in Python Enums the same object?の続きです。Python Enumで可変値が許可されるのはなぜですか?

Enumの値が可変であれば(例えば、listsなど)、これらの値はいつでも変更できます。私は通常のPythonのイディオム与えられ、これは大丈夫だと思う

>>> from enum import Enum 
>>> class Color(Enum): 
     black = [1,2] 
     blue = [1,2,3] 

>>> val_1 = [1,2] 
>>> val_2 = [1,2,3] 
>>> Color(val_1) 
<Color.black: [1, 2]> 
>>> Color(val_2) 
<Color.blue: [1, 2, 3]> 
>>> my_color = Color(val_1) 
>>> my_color.value.append(3) 
>>> Color(val_2) 
<Color.black: [1, 2, 3]> 
>>> Color(val_1) 
Traceback (most recent call last): 
    ... 
ValueError: [1, 2] is not a valid Color 

、と私はEnumメンバーが誰かがうっかり彼が見上げEnumの値を変更する場合は特に、値によって取得された場合、これは問題の何かをもたらすと思いますその意味はユーザーの場合はEnumのようにmutablesを使用しますが、開こうとしているワームの可能性を理解するだけです。

しかし、これは値によってEnumメンバーを検索することができ、その値は変更可能であるため、ハッシュマップ以外の手段でルックアップを実行する必要があります/ dictそのようなdictではkeyとなります。

Enumの値を変更可能なタイプのみに制限すると、値の参照がdictで実装されるように、より効率的ではありません(ただし、付与される可能性は低くなります)。

答えて

1

enum.pyのコードでは、私の2番目の質問への答えが明白に隠れているようです。

Enumハッシュ可能(すなわち不変の)値に対するdictvalue->memberのペアが含まれず、あなたは値によってEnumを検索するとき、それはそのdictからメンバーを取得しようとします。値がハッシュ値でなければ、brute-forceは既存のすべてのEnum値と等しいかどうかを比較し、一致した場合にメンバーを返します。関連するコードは、行にenum.pyで468から476です:

try: 
    if value in cls._value2member_map_: 
     return cls._value2member_map_[value] 
except TypeError: 
    # not there, now do long search -- O(n) behavior 
    for member in cls._member_map_.values(): 
     if member._value_ == value: 
      return member 
raise ValueError("%r is not a valid %s" % (value, cls.__name__)) 

enum.pyの設計者は値でEnum Sを取得したときに迅速な検索を持っていると思ったが、それでも持つの柔軟性を与えたいと思ったかのようにそれが表示されますEnumの値を変更することができます(私はまだ理由を考えることができませんが、なぜ誰かがそれを最初に望むでしょう)。

関連する問題