2011-10-27 4 views
4

Pythonicとは何かに関する別の質問です!この場合のアプリケーションドメインはネットワークアルゴリズムです(ノード、エッジ、ダイクストラ、そのようなもの...)。私は以前に強く型付けされた言語でしかコード化していないものです。ネットワークデータ構造上のメソッドを扱うPythonの方法

一方、Pythonでは、私はクラスを持っていますNet;このクラスの単一インスタンスはネットワークを表します。私はクラスEdgeを持っています。これはネットワークの各エッジに対してインスタンス化されています。各Edgeインスタンスには、とりわけユニークなidがあります。

場合によっては、関連するEdgeインスタンスを参照してエッジを削除したい場合があります。それ以外の時は、idを使ってEdgeを削除したいと思っています。正直言って、私はどの変数がEdgesであり、どれがidsであるかを追跡し始めています。私は、彼らが実際のエッジオブジェクトまたはちょうどであるかどうかを知って、より良い私の変数に名前を付ける -

  1. システムハンガリアン記法を使ってスタート:私は、私はこの仕事:-P

    ためにだから私は2つのソリューションを提案しているC++を好んだと思います私が望むエッジのID。強力なタイピングを実装する - 以外のものを明示的に拒否するには、remove_edgeNetのメソッド)を明示的に拒否します。ラッパー関数remove_edge_idを作成してidからEdgeを検索し、remove_edgeを呼び出します。この関数は同様にid以外のものを拒否します。

  2. ダックタイピングを使用します。引数がidEdgeかどうかを確認してください。ちょうど良いことをしてください。remove_edge

いつものことですか?

+0

あなたが両方のオブジェクト参照を使用して自分自身を発見している理由をバックステッピングと尋ねる価値があるかもしれませんエッジを追跡するためのID。それはC + +の習慣からホールドオーバーですか?他のものを常に変更して、どちらか一方を使用することは可能ですか? –

+1

あなたが言及しているのは「ネットワーク」ではなく「グラフ」です。 –

+0

フェアポイント。私はアプリケーションドメインの用語で盲目になっています;-) –

答えて

4

ダックタイピングソリューションはPythonのはるかにです。しかし、それがIDかエッジかを調べるために引数をテストするのではなく、もっと一般的なケースであるかのように扱ってください。それがうまくいかない場合は、別の方法で試してみてください。

時には唯一の方法である明示的な型チェックを使用する場合はtype()ではなくisintance()を使用してください。そのため、サブクラスで動作します。

変数の名前を正しく指定することはできません。厳密な型指定を使用しているかどうかは不明です。 Edge IDを参照する変数やEdgeインスタンスを参照する変数がある場合、何らかの方法でそれらを区別することは、ダックタイピングを使用している場合でもスマートに見えます。私はedgeedge_idのようなものをハンガリーではなく使っています。

+0

これは決定的かもしれませんが、議論を促すために質問をしばらく開いたままにしておいてください –

2

私は両方の組み合わせを言うだろう。

オブジェクトの名前を知っているか、オブジェクトを見ることによって何ができるのかを(大部分は)把握することをお勧めします。私は私のエッジの名前をedgeとし、エッジのIDはedge_idとする。

私はおそらくremove_edgeのためのあなたのアヒルタイピングアイデアを使用します。

def remove_edge(edge): 
    if isinstance(edge, int): 
     edge = get_edge_from_id(edge) 
    #delete edge here!! 
+0

それは私だけか、それともスタックオーバーフローの原因になりますか? :-) –

+0

Woops!修正しました、ありがとう! – TorelTwiddler

1

あなたがidでご縁を削除する方法を知っていれば、単にこのような何かを行うことができます。

class Net: 
    def remove_edge(self, edge): 
     try: 
     self.remove_edge_by_id(edge.id) 
     except AttributeError:  # oups, edge was not an Edge, it has no id 
     self.remove_edge_by_id(edge) # it should be an id 
+0

+1のように最も一般的なケースを最初に扱う方法のコード例は+1です。それは少し明確になります! –

関連する問題