2011-10-24 16 views
17

私はPinaxや他のdjangoアプリケーションで、空ではなくreturn文を使用するコードを使用しています。違いは何ですか?それは、例えば私が走っている下のdjangoコードに何らかの影響を与えますか?このコードは、ツイートオブジェクトのタグオブジェクトTaggitにハッシュタグを自動的に保存するシグナルメソッドです。Pythonでは、パスとリターンの違いは何ですか

PHPでreturn文を持つかどうかは、解釈されるバイトコードに違いがあるかどうかについての質問がありましたが、Pythonに関連するかどうかはわかりません。

import re 
TAG_REGEX = re.compile(r'#(?P<tag>\w+)') 

def get_tagged(sender, instance, **kwargs): 
    """ 
    Automatically add tags to a tweet object. 
    """ 
    if not instance: 
     return # will pass be better or worse here? 
    post = instance 
    tags_list = [smart_unicode(t).lower() for t in list(set(TAG_REGEX.findall(post.content)))] 
    if tags_list: 
     post.tags.add(*tags_list) 
     post.save() 
    else: 
     return # will a pass be better or worse here? 
post_save.connect(get_tagged, sender=Tweet) 
+0

あなたは何もせずに関数/ ...切株を定義することはできません。 –

答えて

47
if not instance: 
    return # will pass be better or worse here? 

悪い。ロジックを変更します。 passは実際には何もしません。あなたがここにpassreturnを置き換えたい場合は、制御フローは、コードの意味を変え、継続します。

passのための目的は、Pythonのインデントスキームとそうでない場合は不可能である、空のブロックを作成することです。例えば、Cで空の関数は次のようになります。Pythonで

void foo() 
{ 
} 

、これは構文エラーになります:

def foo(): 

passが便利出番は次のとおりです。

def foo(): 
    pass 
16

​​は、現在の関数またはメソッドを終了します。 Passはnull操作であり、次のステートメントで実行を続行できます。

1
if not instance: 
    return # will pass be better or worse here? 

a passは、この方法の実行を継続する。 returnはメソッドの実行を終了します。次の行については、returnをここに入力してください。

else: 
    return # will a pass be better or worse here? 

ここでは違いはありません。 2行全体を削除しても何も変更されません。

しかし、とにかく、この方法を詳しく説明してください。最初から適切なフローを選択する方が良いでしょう。

0

Pythonのドキュメントpassreturnを参照してください。あなたの現在のコードでは違いが(実際には、私は完全に離れてelseを残して)本当にありません。

違いは主にセマンティクスにあります。passは、文が構文的に必要な場合には使用できますが、(まだ)必要ではありません。一方、returnは、明示的な結果を提供する関数のための一種の契約を満たす。

+0

投稿する前にドキュメントを読んでいましたが、実際にこれを理解していませんでした: "ジェネレータ関数では、return文にはexpression_listを含めることはできません。そのコンテキストでは、 StopIterationが呼び出されます。今それは単に「出口を出る」という意味であることは明らかです;)ありがとう! –

1

これは、答えよりもコメントの詳細ですが、それはコメントとして適合しません。

if not instance: 
    return # will pass be better or worse here? 

としては受け入れ答えで説明し、passは正しくないだろう。ここで

else: 
    return # will a pass be better or worse here? 

我々は、関数の最後であることから、passは同じことをするだろう:何を。何もしないので、else節を完全に残す方が良いでしょう。 (禅の中では "明示的なものは暗黙のものよりも良い"というのは事実ですが、これは明示的に何もしないことにほとんど当てはまりません - 実際には最初に不思議に思う人にとってはどうなるでしょうか?)

instanceの名前をなぜ関数内でpostに変更したのかは明らかではありません - パラメータ名を変更するだけでもかまいませんか?sender引数が何のためになっているのでしょうか? )をリスト内で反復処理します:))

13

これはいくつかの以前の回答を示しています。

def p(): 
    "Executes both blocks." 
    if 1: 
    print(1) 
    pass 
    if 1: 
    print(2) 
    pass 

def r(): 
    "Executes only the first block." 
    if 1: 
    print(1) 
    return 
    if 1: 
    print(2) 
    return 
+4

受け入れられた答えは、違いの「精神」を最もよく捕捉しますが、この回答は機能的な違いを説明する素晴らしい仕事です。 :) –

関連する問題