2017-02-09 7 views
1

次のコードを考慮してください。 カンマ区切りの場合、PythonはRottenFruitクラスをどのように解釈しますか?これは合法ですか?はいの場合、ユースケースは何ですか?カンマ区切りのPython列挙型ValueError

from enum import Enum 
class Fruit(Enum): 
    Apple = 4 
    Orange = 5 
    Pear = 6 
a = Fruit(5) 

class RottenFruit(Enum): 
    Apple = 4, 
    Orange = 5, 
    Pear = 6 
print(Fruit(5)) 
print(RottenFruit(5)) 

出力:

Fruit.Orange 
Traceback (most recent call last): 
    File "...\tests\sandbox.py", line 15, in <module> 
    print(RottenFruit(5)) 
    File "...\AppData\Local\Programs\Python\Python36\lib\enum.py", line 291, in __call__ 
    return cls.__new__(cls, value) 
    File "...\AppData\Local\Programs\Python\Python36\lib\enum.py", line 533, in __new__ 
    return cls._missing_(value) 
    File "...\AppData\Local\Programs\Python\Python36\lib\enum.py", line 546, in _missing_ 
    raise ValueError("%r is not a valid %s" % (value, cls.__name__)) 
ValueError: 5 is not a valid RottenFruit 
+0

私は、「話題になったままにする」という評価には同意しません。 OPは、カンマを使用する理由を単純な構文エラーにしない理由を尋ねています。これは興味深いことですが、私は最初にそれを取得しませんでした。編集:今は重複としてマークされていますが、元の元の質問へのリンクはありません。 –

答えて

2

あなたの第二のスニペットはこれに等価である:すなわち

class RottenFruit(Enum): 
    Apple = (4,) 
    Orange = (5,) 
    Pear = 6 

AppleOrangeは長さ1の各タプルです。

簡単な説明を追加します。ここではPythonの2つの機能を組み合わせて実行しています。一つは、あなたがこのように、一度に複数のものを割り当てることができるということです。

x = 7 
y = 8 
y, x = x, y # Now x = 8 and y = 7 
q = [1, 2, 3, 4, 5] 
x, m, *r, y = q # Even fancier: now x = 1, m = 2, r = [3, 4] and y = 5 

他のPythonのパース規則は常にリストの末尾のコンマを許可することです。これは、複数の行にまたがるリストを少しきれいに見せるために有用であり、1要素のタプルを例えば(1,)。これらのルールを実際には役に立たない方法で組み合わせる方法を見つけましたが、防止する価値はありません。

+0

これは、C++でenumを使用している間にカンマを置くのが自然な本能になります。 – goldcode

関連する問題