2011-12-06 19 views
13

スコープ内で初期化されたすべての変数は、Pythonの有効範囲規則のために利用できます。条件文は新しいスコープを導入しないので、他の言語の構文(その条件の前に変数を初期化するなど)は必ずしも必要ではありません。条件変数初期化の方法は何ですか?

def foo(optionalvar = None): 
    # some processing, resulting in... 
    message = get_message() 
    if optionalvar is not None: 
     # some other processing, resulting in... 
     message = get_other_message() 
    # ... rest of function that uses message 

をか、私たちが代わりに持つことができる:例えば、我々が持っているかもしれません。もちろん、

def foo(optionalvar = None): 
    if optionalvar is None: 
     # processing, resulting in... 
     message = get_message() 
    else: 
     # other processing, resulting in... 
     message = get_other_message() 
    # ... rest of function that uses message 

get_messageget_other_message機能は、コードの行数も基本的には無関係であるかもしれない(あなたが想定することができます各パスの後のプログラムの状態が同じであること)。ここでの目標は、関数のこのセクションを超えて、messageを使用できる状態にすることです。

私は後者の構文は以下のような、他の質問に数回使用見てきました:

構築物は、より許容可能である

+1

'get_message'を条件付きで実行するか無条件で実行するかは、完全に依存しませんか? – delnan

+0

ここでの考え方は、呼び出す関数ではなく、むしろ 'message'の構築です。関数自体は無関係です。 –

+1

それが機能であろうとなかろうと、意味的な違いの1つは無条件にコードの半分を実行するということです。違いがある場合は、ディベートスタイルにはほとんど意味がありません。 – delnan

答えて

12

Pythonはまた、あなたは、このdoesnの投稿)あなたはここに

message = get_other_message() if optional_var else get_message() 

それともなし例1とは異なり

message = get_other_message() if optional_var is not None else get_message() 

と厳密に比較したい場合に使用することができる非常に便利な場合は、構文パターンを持っていますget_message()を不必要に呼び出してはいけません。

+1

これは、少なくとも言語そのものに関する条件付き割り当て(v2.5以降)を行う** Pythonicの方法です。詳細については、[PEP 308](http://docs.python.org/release/2.5/whatsnew/pep-308.html)を参照してください。 – voithos

+0

また、PEP 308は、第2フォーマットがこれを行う以前の受け入れ可能な方法であることを示唆しているようです。知っておいてよかった! –

1

これについて明示的なルールを設定しないほうがいいと思っています。代わりに、小さい名前の関数が優れているという考え方に従ってください(新しい名前が導入されたときだけ気をつけることができるからです)。

あなたの条件テストがif/elseよりもはるかに複雑になった場合、非常に注意深い場合を除き、すべてが失敗し、あとで定義されていない名前を使用して実行時エラーが発生する危険性があります。これは可能なときに、最初のスタイルの議論かもしれません。

0

回答は、望まれている副作用があるかどうかによって異なります。get_message()

不要な結果を生成するコードが実行されないため、ほとんどの場合、2番目のものがはっきりと勝ちます。しかし、副作用が必要な場合は、最初のバージョンを選択する必要があります。

0

条件の外で変数を初期化する方がよい場合があります。他の条件を定義する必要がある場合や、いくつかを削除する必要がある場合は、後でmessageのユーザーに初期化されない変数の例外が発生する可能性があります。

4

一般に、get_messageを無条件に呼び出す必要がないため、2番目のアプローチはより優れています。これは、その関数がインセンティブをリソースが、

def search(engine): 
    results = get_from_google() 
    if engine == 'bing': 
     results = get_from_bing() 

検索機能を考慮していない場合は、明らかにこれは良いではありません[OK]をすることができ、私は後者の場合のために、このような悪いシナリオを考えることはできませんので、全てスルーになり、基本的なアプローチオプションを使用し、最後にデフォルトが最良です

def search(engine): 
    if engine == 'bing': 
     results = get_from_bing() 
    else: 
     results = get_from_google()