7

関数から返すために同じデータ型を使用するか、デフォルト値を割り当てますか? またはなし?より良いコーディング方法とその理由は?

例えば。Python のいくつかの疑似コード:

/1

def my_position():   # returns a positive integer if found
    if(object is present):
          position = get_position()
          return position # eg 2,3,4,6
    else: 
          return None     # or return -1 or 0 ??

/2

def get_database_rows():    
    do query to whatever database
    if(rows are found):
       return [list of rows]
    else:
       return None  # or return empty list []  ?

/3

the_dictionary = {'a' : 'john','b':'mike','c': 'robert' }  # values are names i.e. non empty string
my_new_var = the_dictionary.get('z', None)  # or the_dictionary.get('z','')  ?
4

6 に答える 6

8
  1. IndexErrorアイテムが見つからない場合に発生します。これが Python のlist機能です。(または、バイナリ検索または同様の操作を実行するときに、アイテムが存在するはずだったインデックスを返す場合があります。)

  2. 関数が何をするかを論理的に考えてみてください: 何らかの基準を満たす DB 内のすべてのアイテムのリストを返し、そのようなアイテムがない場合、通常のすべてのリスト操作が可能になるため、空のリストを返すのが理にかなっています ( lenin) 明示的なチェックを必要とせずに機能します。

    ただし、必要な項目がないことが矛盾を示している場合は、例外を発生させます。

  3. 私の前の発言は、特にこの場合に当てはまります。取得した値をどうするかによって異なります。キーが見つからない場合、通常dictは単に a を発生させます。KeyErrorその例外を値に置き換えているため、プログラムのコンテキストでどの値が意味を持つかを知っておく必要があります。値がない場合は、例外を飛ばします。

Noneとはいえ、バグがわかりにくくなる可能性があるため、元に戻すことは多くの場合悪い考えです。Noneは Python のデフォルトの戻り値であるため、それを返す関数は、作成者がreturnステートメントを忘れていることを示しているだけかもしれません。

def food(what):
    if what == HAM:
        return "HAM!"
    if what == SPAM:
        return " ".join(["SPAM" for i in range(10)])
    # should raise an exception here

lunch = food(EGGS)    # now lunch is None, but what does that mean?
于 2013-01-29T13:15:28.663 に答える
1

質問にリストされていない別のオプションもあります。例外をスローすることです。Pythonでは十分に人気があるようです。抽象的に最良の解決策を探すよりも、言語の一般的な方法に従う方がよい場合があります。

あなたの例として:

  1. -1私はそれが何をするのか、またはそれが何をするのかを投げることを"".find検討します(私は最初のオプションが最良のものであるという意味ではありません)。1ベースのインデックスを使用することは決してないので、値は有効な結果であり、空を表すために使用することはできません。ValueError[].index0

  2. 発信者が特別な場合として空に興味があるとは限らないので、私は空のリストを好みます。複数のクエリのすべての行をカウントしたい場合は、None特別に処理するのは嫌です。行のリストを作成できない一致する行がないのではなく)論理的に異なる状況がある場合はNone、この場合に例外を使用またはスローすることを検討します。

  3. 例の意味は、特にそれNoneが有効な辞書キーであることを考えると、不明確です。しかし、文字列が通常期待される場所で特別な値を使用する必要がある場合は、それを使用することをお勧めします空の文字列を使用する場合は、それ自体だけを表す有効な空の文字列Noneが必要ないことを確認することが重要です。 )。

于 2013-01-29T13:27:49.337 に答える
1

ケース1:IndexErrorを発生させます。

理論的根拠:-1を返すのはCスタイルですが、上げるのIndexErrorはよりPython的です。

ケース2:空のリストを返します。

理論的根拠:不要なnullチェックを避けてください。「EffectiveJava(2ed)Item43 Return a empty array or collections、not nulls」という本も参照してください(はい、Javaですが、引数はまだ有効です)

ケース3:依存します。

KeyError理論的根拠:空の文字列であろうと実際のニーズに依存するものであろうと、上げたくない場合はNone、2つのことに注意してくださいNone。次に、空の文字列が有効な値と区別できることを確認します(つまり、有効な値を空にすることはできません)。それが疑わしい場合は、None代わりに使用してください。

于 2013-01-29T13:26:28.080 に答える
1

Exceptions are generally preferred, but if you don't want to use them, it really depends on what you want.

When asking for a non-existant item's index in a list returning None is probably as good as returning -1 because, well, there is no possible good answer to that query. After calling that function, I have to check whether it could produce a result or not before proceeding with the result.

Bu when asking the list of all odd numbers in a list, you should return [] rather than None because [] is a perfectly valid answer. I might want to know how many odd numbers I have in the original list, and 0 is the answer I need if it is empty, so something like

len(odd_numbers(lst))

should always work. Returning None in that situation would be tricky and error-prone as I would have to do

0 if odd_numbers(lst) is None else len(odd_numvers(lst))
于 2013-01-29T13:30:50.793 に答える
0

この場合、空のリストの方が優れていると思いますが、この質問に対する「一般的な」答えはないと思います。状況によって異なることがよくあります。絶対に避けるべきことの 1 つは、(None を除いて) ine 型以上の値を返すことです。関数 coulr が返されるコードを見たことがあります: string、None、bool、1、2、および 3。それは脅威でした。

于 2013-01-29T13:11:31.040 に答える
0

これらのケースは異なります。

1 -return position # eg 2,3,4,6

これはレコードのようなものなので、None私には理にかなっています。(または、他の人が述べたように、常にポジションを持っていることを期待している場合は、例外を発生させます。)

2 -return [list of rows]

これは行のリストであるため、返すこと[]は論理的であり、結果を反復する特別なケースは必要ありません。単に使用できますfor row in rows:

3 - `the_dictionary = {'a':'ジョン','b':'マイク','c':'ロバート'}

繰り返しますが、これはレコードのように見えるので、欠損値は当然None(通常) になります。(そして、常に辞書があると予想される場合は、例外を発生させます)。

于 2013-01-29T13:12:26.047 に答える