これを機能させるには複数の障害があり、おそらく不可能かもしれませんが、少なくとも質問したいと思いました...
したがって、AbstractEnumeratedConstantsGroup
当然のことながら、subclassed が列挙された定数のグループを表すオブジェクトを作成するクラス ( returns 、returns 、returns 、returnsなどのFLAVORS
値('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
を含む) を作成するときに、メタクラスとその他のフットワークを使用するクラスがあります。新しい定数グループを作成するために必要なものは次のとおりです。FLAVORS[0]
'VANILLA'
FLAVORS[1]
'CHOCOLATE'
FLAVORS.VANILLA
0
FLAVORS.CHOCOLATE
1
class FLAVORS(AbstractEnumeratedConstantsGroup):
_constants = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
FLAVORS = FLAVORS()
次のようにさらに削減したいと思います。
@enumerated_constants_group
FLAVORS = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
乗り越える方法がわからない問題は次のとおりです。
-
1. デコレーター コードから定義スコープからオブジェクトのラベル名を取得する適切な方法がない 2. クラス、メソッド、または関数ではないものをデコレートできない
ファクトリ/ビルダーの使用を検討しましたが、それについて気に入らないのは、コード内でグループ名を重複させる必要があること、またはグループに役に立たない__name__
値があることです (これらは および で使用されます__repr__
) __str__
。元:
FLAVOR = enumerated_constants_group('FLAVOR', ('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
また
FLAVOR = enumerated_constants_group(('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
# FLAVOR.__name__ becomes some unfriendly machine-generated string
デコレーターのアイデアに代わるものとして、ファクトリ メソッドから (イントロスペクションを通じて、または関数に暗黙的に渡すことによって) 呼び出しスコープを参照して、メソッドを呼び出すと、新しく作成されたオブジェクトが呼び出し元の名前空間に挿入されるようにすることは可能でしょうか?与えられた名前?元:
enumerated_constants_group('FLAVOR', ('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
# I could now reference FLAVOR in any arbitrary scope that the method was called from
私が望むものを達成するためにできることはありますか?私が考えていない他のアプローチはありますか?