私がしようとしていることは機能的にはコード化するのは簡単ですが、これを整理するためのクリーンでスケーラブルな方法を探しています...「美しいものは醜いよりも優れています。いくつかの大きなデータソースからデータを抽出する(多くの)方法を整理するにはどうすればよいですか?
私はいくつかの異なる場所からアイテムについての情報を収集するアプリケーションを持っています。生データが収集されたら、このデータから多くの属性を抽出する必要があります。
アイテムのデータへのインターフェイスは、簡単なdict
のように機能し、フレンドリキー名でアトリビュートにアクセスします。私はsubclassing one of the ABCs from the collections moduleによってこれを達成できることを知っています。
私の質問は、データ属性を抽出するために必要な多くの機能を(きれいに)整理するにはどうすればよいですか?
私は...別々のモジュール/クラスにデータソースと抽出機能をブレークキャッシュされたプロパティを使用することができます...
私は、次のように単一のクラスでそれらのすべてを置くことを検討している:
をclass item_data(object):
def __init__(self, item_name):
self.name = item_name
self._item_data = {'name': item_name}
self._data_a = _get_data_from_source_a()
self._data_b = _get_data_from_source_b()
def _get_data_from_source_a(self):
pass
def _get_data_from_source_b(self):
pass
def _extract_attr_1(self):
# Extract some data attribute from _data_a
pass
def _extract_attr_2(self):
# Extract some data attribute from _data_a
pass
def _extract_attr_3(self):
# Extract some data attribute from _data_b
pass
_attr_extract_methods = {
'Attribute 1': _extract_attr_1,
'Attribute 2': _extract_attr_2,
'Attribute 3': _extract_attr_3,
}
def __getitem__(self, item):
if item not in self._item_data:
self._attr_extract_methods[item](self)
return self._item_data[item]
データソース(および関連する属性抽出関数)を独自のモジュール/クラスに分解したい場合は、新しいデータソースと属性を簡単に追加できるように、どのようにクリーンでスケーラブルな方法で行うことができますか後で?データソースクラスが自分自身と関連する属性をトップレベルクラスに登録できるようにする方法はありますか?
注:これは、Python v2.7 +とv3.xの両方をサポートするように書かれているアプリで解読されています。
...私はアウトソースを壊す好きです関連するメソッドを使用してそのソースのデータから属性を抽出する独自のクラスに変換します。しかし、私は、インターフェイスの 'ItemData'クラスが属性のすべてのソースを調べるのが好きであるとは確信していません。それは確かにそれを行う一つの方法です。私は、データソースクラスをインターフェイスクラスに動的に登録し、提供できる属性を「ロード」できるようにする方法を検討しています。 – cmlccie
私はあなたを正しく理解していれば、モデル 'DataSource'にデータをロードする動的な方法を実装するのは簡単です。私は私の答えを付け加えました。 – Fomalhaut
私は、スケーラビリティを向上させるために、DataSourcesにItemDataクラスでその属性を動的に登録させることを指しています。基本的には、追加のデータソースを追加するときに必要な変更を最小限に抑えようとしています。追加の属性を提供する追加のDataSourceを追加するのに必要な最小限の作業で、ItemDataクラスを通じて 'すべての属性'を使用できます。 – cmlccie