Pythonの別のEnums実装

昨年、Pythonコミュニティはついに列挙型の実装に同意しました。 対応するPEP 435提案が開発され、その実装は既にPython 3.4にあります。



激しい議論を見て、私は自分の自転車を作るための実験として、いくつかの機能を追加しましたが、公式の実装ではその可能性は低いでしょう。



現時点では、実験は終了し、ライブラリは私のプロジェクトでうまく表示されたため、コミュニティと共有することにしました。



ほとんどの場合、フォーム<name、value>の関係を説明するとき、名前に関連付ける情報がたくさんあります。ユーザーインターフェイスの補助テキスト、兄弟へのリンク、他のオブジェクトまたは関数へのリンクです。 追加のデータ構造をフェンスする必要がありますが、これは良くありません-結局は余分なエンティティです。



したがって、リレーショナルデータモデルに触発されて、私はバイナリ関係の形式で列挙の実装を放棄し、完全なテーブルに展開することにしました。



同時に追加:





その結果、私たちはそのようなことを得ました(すでに長い「キャンバス」を増やさないように例を分割しないことにしました):



######################## #   ######################## from rels import Column, Relation # Enum  EnumWithText     #    rels.Enum  rels.EnumWithText #        class Enum(Relation): #    name = Column(primary=True) #    value = Column(external=True) #    #  —     -  # ,      class EnumWithText(Enum): text = Column() class SOME_CONSTANTS(Enum): #    records = ( ('NAME_1', 1), #      ('NAME_2', 2)) class SOME_CONSTANTS_WITH_TEXT(EnumWithText): #     records = ( ('NAME_1', 1, 'constant 1'), ('NAME_2', 2, 'constant 2')) #    #    SOME_CONSTANTS.NAME_1.name == 'NAME_1' # True SOME_CONSTANTS.NAME_1.value == 1 # True #     «»  SOME_CONSTANTS(1) == SOME_CONSTANTS.NAME_1 # True #  SOME_CONSTANTS.NAME_2 == SOME_CONSTANTS.NAME_2 # True SOME_CONSTANTS.NAME_2 != SOME_CONSTANTS.NAME_1 # True #          SOME_CONSTANTS.NAME_2.is_NAME_1 # False SOME_CONSTANTS.NAME_2.is_NAME_2 # True #    —  , #          SOME_CONSTANTS.NAME_2 != SOME_CONSTANTS_WITH_TEXT.NAME_2 # True SOME_CONSTANTS.NAME_1 != SOME_CONSTANTS_WITH_TEXT.NAME_1 # True #  —    class EXTENDED_CONSTANTS(SOME_CONSTANTS_WITH_TEXT): #      records = ( ('NAME_3', 3, 'constant 3'), ) #     ######################## #  ######################## class ENUM(Relation): name = Column(primary=True) #       .index_name value = Column(external=True) #       .index_value text = Column(unique=False, index_name='by_key') #      records = ( ('NAME_1', 0, 'key_1'), ('NAME_2', 1, 'key_2'), ('NAME_3', 2, 'key_2'), ) #     ,       ENUM.index_name # {'NAME_1': ENUM.NAME_1, 'NAME_2': ENUM.NAME_2, 'NAME_3': ENUM.NAME_3} #      ,        ENUM.by_key # {'key_1': [ENUM.NAME_1], 'key_2': [ENUM.NAME_2, ENUM.NAME_3]} ######################## #   ######################## #  ,     class DESTINATION_ENUM(Relation): name = Column(primary=True) val = Column() records = ( ('STATE_1', 'value_1'), ('STATE_2', 'value_2') ) #  ,    class SOURCE_ENUM(Relation): name = Column(primary=True) val = Column() rel = Column(related_name='rel_source') records = ( ('STATE_1', 'value_1', DESTINATION_ENUM.STATE_1), ('STATE_2', 'value_2', DESTINATION_ENUM.STATE_2) ) #    DESTINATION_ENUM.STATE_1.rel_source == SOURCE_ENUM.STATE_1 # True DESTINATION_ENUM.STATE_2 == SOURCE_ENUM.STATE_2.rel # True
      
      





別途、コードで転送を宣言する必要がないことに注意してください。 多くの場合、データモデルの宣言に限定し、スプレッドシートなどのサードパーティのソースからデータ自体を読み込む方が便利です。



GitHubのリポジトリと詳細なドキュメント



PSライブラリはPython 2.7を念頭に置いて開発されたもので、3番目のライブラリはテストされていません。



All Articles