Pythonで列挙を作成しようとしています。私はいくつかの解決策を見てきました( ここで@alec thomasによる2番目の回答が最も興味をそそられました)が、列挙を不変にしたいと思います。不変のpython レシピを見つけましたが、dict のようなキーと値の関連付けが必要です。
ダックパンチングを使用して、またはプロパティAttributeError
を呼び出そうとした場合にスローするプロパティをクラスに追加しようとしていました。fset
fdel
fget
プロパティの機能を定義する際に問題が発生しました。これが私がこれまでに持っているコードです:
def enum(*sequential, **named):
# Build property dict
enums = dict(zip(sequential, range(len(sequential))), **named)
# Define an errorhandler function
def err_func(*args, **kwargs):
raise AttributeError('Enumeration is immutable!')
# Create a base type
t = type('enum', (object,), {})
# Add properties to class by duck-punching
for attr, val in enums.iteritems():
setattr(t, attr, property(lambda attr: enums[attr], err_func, err_func))
# Return an instance of the new class
return t()
e = enum('OK', 'CANCEL', 'QUIT')
print e
print e.OK
print e.CANCEL
print e.QUIT
# Immutable?
e.OK = 'ASDF' # Does throw the correct exception
print e.OK
これからの出力は次のとおりです。
<__main__.enum object at 0x01FC8F70>
Traceback (most recent call last):
File "enum.py", line 24, in <module>
print e.OK
File "enum.py", line 17, in <lambda>
setattr(t, attr, property(lambda attr: enums[attr], err_func, err_func))
KeyError: <__main__.enum object at 0x01FC8F70>
おそらく、これは列挙を作成する最良の方法ではありませんが、短いので、このダック パンチ/モンキー パッチの概念全体をもっと探求したいと思いました。