2010-12-02 22 views
3

私はPythonプログラミング(C/C++バックグラウンド)にはかなり新しいです。 私はリストの辞書の辞書のような複雑なデータ構造を使用する必要があるコードを書いています。 問題は、これらのオブジェクトを使用する必要があるときに、構造を覚えていて、アクセスする方法がほとんどないことです。 これにより、数日間修正されていないコードの作業を再開するのが難しくなります。 非常に貧弱な解決策は、各変数にコメントを使用することですが、それは非常に柔軟性がありません。 Python変数はメモリへのポインタに過ぎず、静的に型宣言することはできませんが、複雑なデータ構造の使用を容易にするためのコンベンションやルールはありますか?Pythonで複雑なデータ構造の型を宣言する

+0

いい名前を使用しますか? ;) – delnan

+1

辞書が既知の固定キーセットを使用している場合は、C++のようにクラスを使用する方が自然かもしれません。それ以外の場合は、有益な名前を選択しようとします。 –

+0

Russelに、コメントをいただきありがとうございますが、私は辞書が自分のコードでやるべきことに適していると思うので、クラスを使用することは非生産的です。しかし一般的に言えば、あなたのことを覚えておいてください。 –

答えて

3

クラスにdocstringsを使用する場合は、help(vargoeshere)を使用してその使用方法を確認できます。

+0

答えがありがとう、すべてのことが考えられる最良の解決策は、コメントと自己説明的な変数名(もちろんハンガリー表記なし(感謝丸薬))を使用することです。 –

1

私はあなたの複雑な構造のいくつかを見て、あなたがそれらで何をしているのかを聞いて尋ねるべきだと思っています...これはPythonicですか?ここでSOに尋ねてください。私は複雑さがC/C++の人工物であるいくつかのケースを見つけると思います。

+0

これは絶対に正しいです。私は自分のC/C++エクスペリエンスの影響を受けず、可能な限りPython指向のコードを書くように努めました。 –

0

コードのどこかに、またはテストの中の例を含めます。

2

何をしても、私は繰り返し、ハンガリー記法を使用しないでください!それは重度の脳を引き起こす&ビット腐敗。

あなたは何をすればよいですか? PythonとC/C++は全く異なっています。 Cでは、あなたは、通常のような多型のコールを処理++ので:C++での

void doWithFooThing(FooThing *foo) { 
    foo->bar(); 
} 

ダイナミック多型は、継承に依存します。doWithFooThingに渡されたポインタが唯一FooThingまたはそのサブクラスの1つのインスタンスを指すことがあります。ないPythonでよう:ここ

def do_with_fooish(fooish): 
    fooish.bar() 

、任意の十分fooishもの(呼び出し可能なバー属性を持つ、すなわちすべてが)に関係なく、それは継承によって、他のfooishのものにreleatedされるか、使用することはできません。

ここでのポイントは、C++ではすべてのオブジェクトにどのような(基本)タイプがあるのか​​を知っていますが、Pythonではそうではありません。あなたがPythonで達成しようとしているのは、クラス継承の厳格なルールの下で何かを強制する必要なしに、できるだけ多くの状況で再利用可能なコードです。あなたの命名にもそれが反映されるはずです。

def some_action(a_list): 
    ... 

しかし:seqがリストが、任意の反復可能シーケンスだけでなくかもしれない

def some_action(seq): 
    ... 

は、そのリスト、タプル、辞書、設定、反復子、何をすることをあなたが書くいけません。

一般に、型構造ではなくコードの意図を強調します。代わりに、書き込みの:

dict_of_strings_to_dates = {} 

次のように記述:

users_birthdays = {} 

また、それ以上にC/C++に比べて、短いの機能を維持するのに役立ちます。そして、あなたは何が起こっているのかを簡単に見ることができます。

別のこと:Python変数をメモリへのポインタと考えるべきではありません。彼らは実際にはdicionaryエントリーしている:そう正確常に

assert foo.bar == getattr(foo, 'bar') == foo.__dict__['bar'] 

ない、私は同意するが、詳細はdocs.python.org見上げことができます。

また、Pythonでは、はC/C++のようにと宣言していません。あなたはただものを定義します。

+0

ここで非常に優れた議論、thx – Pete

+0

私は関数の引数を1つの型として考えています。これは今度は私が書いた関数に影響を与えます。 Pythonの重要な部分は、以前の制約のすべてを解き放つことであり、その結果として我々が開発した方法論です。 – Pete

関連する問題