2008-09-01 16 views
57

私は文字列に何かする必要がある関数を持っています。操作が成功したかどうかを示すブール値を返す関数が必要です。また、変更された文字列も返す必要があります。Pythonの関数から複数の値を返す最も良い方法はありますか?

C#では、文字列にoutパラメータを使用しますが、Pythonでは同等のものはありません。私はまだPythonの新機能ですが、私が考えることができるのはブール値と変更された文字列を含むタプルを返すことだけです。

関連質問:Is it pythonic for a function to return multiple values?

+0

関連する質問へのリンクを追加しました – jfs

答えて

116
def f(in_str): 
    out_str = in_str.upper() 
    return True, out_str # Creates tuple automatically 

succeeded, b = f("a") # Automatic tuple unpacking 
+1

私はこのアプローチが配列と行列でも機能すると付け加えたいと思います。 – Nicholas

7

タプルを返すには、Pythonでこれを行うには通常の方法です。

15

タプルを返します。操作が成功しなかった場合に例外をスローしないのはなぜ

def f(x): 
    # do stuff 
    return (True, modified_string) 

success, modified_string = f(something) 
+0

天気について私のパートナーは、複数の値を返すときに '('と ')を追加する必要があります。 Pycharmにコードを書くと、ideは '()'で複数の値を返す行に印をつけますが、pep8でコードスタイルの規則を見つけることができません。あなたはどう思いますか?ありがとうございました。 –

28

?個人的には、関数から複数の値を返す必要がある場合は、適切なやり方をしているかオブジェクトを使用しているかを再考する必要があるという意見になりがちです。

ただし、より直接的には、例外をスローすると、問題に対処する必要があります。失敗を示す値を返そうとすると、誰かが値をチェックできず、いくつかの潜在的にエラーをデバッグできなくなる可能性が非常に高いです。

+1

合意。 Python関数は、他の関数よりもはるかに高い確率で成功/失敗を示すコードを返すべきではありません。例外的なケースで例外を投げるだけです。 これは、必要なときにタプルを返すだけです: "return a、b、c" –

+5

私は致命的ではないエラーに対して例外をスローする関数が嫌いです。 –

+3

障害が一般的な場合は、タプル内の障害情報を返すことは良いアプローチです。例としては、テスト値で複数回呼び出して「良い」値を見つける関数がありますが、何度も失敗して最終的には良い値を見つけることが期待されます。その場合は、例外を発生させるのではなく、単に「結果を返す」ことが必要です。 – Graham

3

失敗の例外をスローすることは進歩の良い方法の1つで、多くの異なる値を返す場合は、タプルを返すことができます。あなたが引用している特定のケースでは、私はしばしば中間的なアプローチをとります:成功すると変更された文字列を返し、失敗したらNoneを返します。私は失敗したときにcharへのNULLポインタを返すために、再構築されていないCプログラマで十分です。

大きなライブラリの一部として使用され、他の開発者が使用するルーチンを作成していた場合、失敗した場合は例外がスローされます。私が自分のドッグフードを食べているときは、おそらくいろいろな種類のものを返して帰りにテストします。

関連する問題