激しい議論を見て、私は自分の自転車を作るための実験として、いくつかの機能を追加しましたが、公式の実装ではその可能性は低いでしょう。
現時点では、実験は終了し、ライブラリは私のプロジェクトでうまく表示されたため、コミュニティと共有することにしました。
ほとんどの場合、フォーム<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番目のライブラリはテストされていません。