1

動的型付けされたコードを維持する経験が不足しているので、私はこの種の状況を処理するための最良の方法を探しています:

(Pythonの例ですが、動的型付けされた任意の言語で機能する可能性があります)

def some_function(object_that_could_be_a_list):
     if isinstance(object_that_could_be_a_list, list):
          for element in object_that_could_be_a_list:
              some_function(element)
     else:
          # Do stuff that expects the object to have certain properties 
          # a list would not have

メソッドは1つのことしか実行できないと思うので、これにはかなり不安があります。また、メソッドは本来あるべきほど読みにくいと思っています。したがって、3つの関数を作成したいと思います。最初の関数は任意のオブジェクトを取得し、他の2つの関数間で「ソート」します。1つはリスト用、もう1つは「単純な」オブジェクト用です。繰り返しになりますが、これにより複雑さが増します。

ここで最も「持続可能な」ソリューションは何ですか、そしてメンテナンスの容易さを保証するソリューションは何ですか?私が気付いていない状況のためのPythonのイディオムはありますか?前もって感謝します。

4

4 に答える 4

6

チェックを入力しないでください-やりたいことを実行してください。それが機能しない場合は、キャッチして管理できる例外がスローされます。

Pythonのマントラは、「許可ではなく、許しを求める」です。タイプチェックには余分な時間がかかりますが、ほとんどの場合、それは無意味です。また、ダックタイプの環境ではあまり意味がありません。それが機能する場合、なぜタイプするのかを誰が気にしますか?他の反復​​可能オブジェクトも機能するのに、なぜリストに制限するのですか?

例えば:

def some_function(object_that_could_be_a_list):
    try:
        for element in object_that_could_be_a_list:
            some_function(element)
    except TypeError:
        ...

これはより読みやすく、より多くの場合に機能し(リストではない他の反復可能ファイルを渡すと、たくさんあります)、多くの場合、より高速になります。

用語が混同されていることに注意してください。Pythonは動的に型付けされますが、弱い型付けはされません。弱い型付けとは、オブジェクトが必要に応じて型を変更することを意味します。たとえば、文字列とintを追加すると、文字列がintに変換されて追加が行われます。Pythonはこれを行いませ。動的型付けとは、変数の型を宣言しないことを意味します。変数には、ある時点で文字列が含まれ、後でintが含まれる場合があります。

ダックタイピングは、オブジェクトのタイプを気にせずにオブジェクトを使用することを説明するために使用される用語です。それがアヒルのように歩き、アヒルのように鳴くなら、それはおそらくアヒルです。

さて、これは一般的なことであり、コードが「正しい」よりも「間違った」タイプのオブジェクトを頻繁に取得すると思われる場合は、速度のチェックを入力することをお勧めします。これはまれであり、時期尚早の最適化を避けることが常に最善であることに注意してください。例外をキャッチしてそれを実行し、テストします。ボトルネックであることがわかった場合は、最適化します。

于 2012-04-14T17:49:15.000 に答える
2

一般的な方法は、さまざまな種類の入力にさまざまなパラメーターを使用して、複数のインターフェースを実装することです。

def foo(thing=None, thing_seq=None):
    if thing_seq is not None:
        for _thing in thing_seq:
            foo(thing=_thing)
    if thing is not None:
        print "did foo with", thing
于 2012-04-14T18:00:57.563 に答える
2

再帰的に行うのではなく、次のようにする傾向があります。

def foo(x):
    if not isinstance(x, list):
        x = [x]
    for y in x:
        do_something(y)
于 2012-04-14T18:22:46.717 に答える
1

この場合、デコレータを使用して、より保守しやすくすることができます。

from mm import multimethod

@multimethod(int, int)
def foo(a, b):
    ...code for two ints...

@multimethod(float, float):
def foo(a, b):
    ...code for two floats...

@multimethod(str, str):
def foo(a, b):
    ...code for two strings...
于 2012-04-14T17:52:16.570 に答える