2012-07-23 4 views
5

私はプログラミングパズルを解き、小さなスクリプトを書くなど、いくつかの愚かなことをpythonでやりたがっています。ある時点で、データを表現する新しいクラスを作成すべきか、リストやタプルにパックされたすべての値を取得します。極端な怠惰と個人的にはselfというキーワードの嫌いなので、私は通常2番目のオプションを使用します。 path.min_costpoint.x, point.yがはるかに表現力path[2]point[0], point[1]よりですので、私はデータ型定義された長期利用者におけるよりも理解リストまたはタプルを使用する代わりに新しいタイプを導入する時期を決定する方法は?

が良いです。しかし、関数から複数のものを返す必要があるとき、それはあまりにも多くの作業として私を襲う。

私の質問は、ユーザー定義のデータ型をいつ作成するのか、リストやタプルを使うのが良いのでしょうか。それとも、私が気づいていないきちんとしたpythonicな方法がありますか?

ありがとうございました。

+4

実際には 'self'はキーワードではなく普通の変数名です。どんな場合でもそれに固執することを強くお勧めしますが、実際には 'self'ではなく' _'を使用することができます。 – Kimvais

+0

プログラムを2回以上使用すると、クラスに書き込む方がよいでしょう。 – aasa

答えて

2

まず、表現力についての観察。 point.xpoint.ypoint[0], point[1]の相対的な表現力に懸念があると述べましたが、これは複数の方法で解決できる問題です。

x, y = get_point(foo) 

私は、これは、ちょうど約などの表現point.xとしてあると言うでしょう。実際には、簡単なpoint構造のために、私はあなただけでこれを行うことができます場合は特に、クラスが過剰であると判断される引数があると思いますpoint.y;とにかく(バニラクラスよりも速いかもしれません(__dict__ルックアップはありません)タプルにはほんの数アイテムしか含まれていないと仮定するとかなり読みやすくなります。

クラスに何かを入れるかどうかを決める私のアプローチは、プログラム全体のデータを使う方法と関連があります。「これはの状態ですか?私が知っているデータがたくさん変わって、1つの場所に格納し、ある目的のために作られた関数群によって操作される必要があるなら、私はデータがおそらく状態であることを知っています。クラス。一方、私が変更されない、または一時的なデータを持っていたら、それを済ませたら消えるはずです。おそらく状態ではなく、おそらくクラスに入る必要はありません。

これはもちろん、経験則です。たとえば、15種類のローカル変数(したがって、namdetupleの存在)を持たなくてもかなり複雑なデータのコレクションを操作できるように、ある種の「レコード」型が必要な場合が考えられます。しかし、1つまたは2つの値を受け取り、1つまたは2つの値を返す関数を作成するほうが良いでしょう。タプルまたはリストは完全にうまくいきます。

2

これは確かに主観的ですが、私は少なくとも驚きの原則を守ろうとします。

戻り値がオブジェクトの特性を記述している場合(例ではpoint.xpoint.yなど)、クラスを使用します。

これらが同じオブジェクトの一部でない場合(return min, maxとしましょう)、それらはタプルでなければなりません。

8

あなたはcollections.namedtupleを認識していますか? (since 2.6

def getLocation(stuff): 
    return collections.namedtuple('Point', 'x, y')(x, y) 

又は、より効率的に、

Point = collections.namedtuple('Point', 'x, y') 
def getLocation(stuff): 
    return Point(x, y) 

namedtupleインデックス(point[0])および解凍(x, y = point)によってtupleと同じ方法でアクセスすることができ、それはほぼ無痛アップグレードパスを提供。

+0

また、 'class Foo(namedtuple(" BaseFoo "、" ham spam "))'のように 'namedtuple'を継承することもできます。これにより、コンストラクタの定型文を書き出す手間を省きます。 –

関連する問題