パスステートメントの使用方法


392

私はPythonを学習している最中で、このpassステートメントに関するセクションにたどり着きました。私が使用しているガイドNullでは、プレースホルダーとして一般的に使用されるステートメントであると定義しています。

それがどういう意味かはまだよくわかりません。誰かが私にpassステートメントが使用される単純な/基本的な状況を教えてもらえますか、なぜそれが必要なのですか?


4
私はこれを実際に行う必要はありませんでしたがpass、サブクラスのメソッドをオーバーライドして何もしない場合に便利でしょう。
kojiro


1
例外を処理するときに非常に便利です。例外は、別のタイプの処理を必要とするだけの通常の状態を意味する場合があります。その場合passexceptブロックは非常に便利です。
Mad Physicist

回答:


475

まだ実装したくないいくつかのメソッドを持つ新しいクラスを設計しているとします。

class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

を省略したpass場合、コードは実行されません。

次に、以下を取得します。

IndentationError: expected an indented block

要約すると、passステートメントは特に何もしませんが、ここに示すように、プレースホルダーとして機能できます。


22
さて、この場合、を使用することもできますがreturn、明確さが少し失われます。

38
これが質問に適切に答えるとは本当に思いません。何かの可能な用途を引用することは、たとえそれが最も一般的な用途であっても、それが何のためにあるのかを説明することと同じではありません。
Schilcote 2014年

5
@シルコテ:私はあなたの意見を理解しています。最初の回答に別の短い説明を追加しました。しかし、単純な例は特定の概念を理解するのに役立つことが多いと思います。
sebastian_oe 14年

3
以下の@Anaphoryによる回答は、これがなぜ言語の重要な要素であるかを示しています。
John

2
これはの1つの使用法を説明していますがpass、それが何をするのかはまだよくわかりません。これを本番コードで使用することはありますか?あなたの例から、私はそれを実装する準備ができるまでそのメソッドを追加しないことを選ぶか、または単にそうするでしょうreturn
theUtherSide 2018

221

Pythonは(後にコードブロックこと構文要件有しifexceptdefclass等)は空にすることはできませんが。ただし、空のコードブロックは、以下の例のように、私が見た中で最も頻繁に使用されるさまざまな状況で役立ちます。

したがって、コードブロックで何も起こらないはずの場合は、そのpassようなブロックがを生成しないようにするためにa が必要ですIndentationError。または、任意のステートメント(Ellipsisリテラル...や文字列などの評価対象の用語だけを含む、ほとんどの場合はdocstring)を使用できますが、pass実際には何も起こらないはずであり、実際に評価する必要はなく、 (少なくとも一時的に)メモリに保存されます。

  • 特定のタイプの(すべてまたは)を無視する(Exception例:)xml

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown

    注:から、次の例のように、昇給のすべてのタイプを無視しpandas、それはまた、おそらく、発信者に渡されるべき例外をキャッチしているため、一般的に、悪い習慣と考えられ、例えば、KeyboardInterruptまたはSystemExit(あるいはHardwareIsOnFireError-どのようにあなたはありません知っています特定のエラーが定義されているカスタムボックスで実行している場合、一部の呼び出し側アプリケーションはこのことについて知りたいと思いますか?)。

    try:
        os.unlink(filename_larry)
    except:
        pass

    代わりに、except Error:またはこの場合は少なくとも使用するexcept OSError:方がはるかに優れたプラクティスと見なされます。インストールしたすべてのpythonモジュールを簡単に分析すると、すべてのexcept ...: passステートメントの10%以上がすべての例外をキャッチしているため、Pythonプログラミングでは依然として頻繁なパターンです。

  • 新しい動作を追加しない例外クラスの派生(例:)scipy

    class CompileError(Exception):
        pass

    同様に、抽象基本クラスとして意図されたクラスは、多くの場合__init__、サブクラスが派生するはずの明示的な空のメソッドまたは他のメソッドを持っています。(例pebl

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • そのコードをテストすると、(からのmpmath)結果を気にすることなく、いくつかのテスト値に対して適切に実行されます。

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • クラスまたは関数の定義では、多くの場合、ブロック内の唯一のものとして実行される義務的なステートメントとして、docstringがすでに配置されています。そのような場合、「これは本当に何もしないことを意図している」と言うために、ブロックはdocstring pass に加えて含むかもしれません。例えばpebl

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • いくつかのケースでは、pass私は個人的に好むが、「このメソッド/クラス/ IF-ブロック/ ...が、まだ実装されていないが、これはそれを行うための場所になります」と言うためのプレースホルダとして使用されるEllipsisリテラルを...するために、これと前の例の意図的な「no-op」を厳密に区別してください。(EllipsisリテラルはPython 3でのみ有効な式であることに注意してください
    たとえば、モデルを大まかに書くと、次のようになります。

    def update_agent(agent):
        ... 

    他の人が持っているかもしれない場所

    def update_agent(agent):
        pass

    def time_step(agents):
        for agent in agents:
            update_agent(agent)

    update_agent後で関数に入力することを思い出させますが、残りのコードが意図したとおりに動作するかどうかを確認するために、いくつかのテストをすでに実行しています。(この場合の3番目のオプションraise NotImplementedErrorはです。これは特に次の2つの場合に役立ちます。「この抽象メソッドはすべてのサブクラスで実装する必要があります。この基本クラスで定義する一般的な方法はありません」または「この関数は、この名前は、このリリースではまだ実装されていませんが、これはそのシグネチャがどのようになるかを示しています」


これははるかに良い答えです!
rjoxford

22

実装されていない関数のプレースホルダーとしての使用に加えpassて、if-elseステートメントへの入力に役立ちます(「明示的は暗黙的よりも優れています。」)

def some_silly_transform(n):
    # Even numbers should be divided by 2
    if n % 2 == 0:
        n /= 2
        flag = True
    # Negative odd numbers should return their absolute value
    elif n < 0:
        n = -n
        flag = True
    # Otherwise, number should remain unchanged
    else:
        pass

もちろん、この場合、おそらくreturn代入の代わりに使用しますが、変更が必要な場合は、これが最もよく機能します。

ここでの使用は、pass将来のメンテナ(自分も含む!)に、条件文の外に冗長なステップを置かないよう警告するのに特に役立ちます。上記の例でflagは、は具体的に言及された2つのケースで設定されていますが、else- ケースでは設定されていません。を使用しない場合pass、将来のプログラマーflag = Trueは条件の外に移動する可能性があります。したがってflagすべての場合で設定になります。


別のケースは、ファイルの下部によく見られるボイラープレート関数です。

if __name__ == "__main__":
    pass

一部のファイルでは、pass後で簡単に編集できるようにそのままにしておき、ファイルを単独で実行しても何も起こらないことを明示することをお勧めします。


最後に、他の回答で述べたように、例外がキャッチされたときに何もしないと便利な場合があります。

try:
    n[i] = 0
except IndexError:
    pass

2
最初の2つの例は一般的に悪い習慣だと思います。最初の例については、「NameError:名前 'フラグ'が定義されていません」というあいまいなエラーを後で防ぐためflag = Falseに、if ... elif ブロックの前に設定する必要があります。2番目の例に関しては、if __name__ == "__main__": pass直接実行したときに何もしないPythonファイルの大部分に追加する必要があるのは奇妙なようです(これは、モジュールコードを記述している場合です)。Python> = 3.0では、「後で終了する」ブロックを示す...代わりに(省略pass記号)を使用する必要があります。
ostrokach

18

考えられる最善かつ最も正確な方法passは、インタプリタに何もしないように明示的に指示する方法としてです。同様に次のコード:

def foo(x,y):
    return x+y

「関数foo(x、y)を呼び出した場合、ラベルxとyが表す2つの数値を合計し、結果を返す」を意味します。

def bar():
    pass

「関数bar()を呼び出しても、何もしない」という意味です。

他の答えはかなり正しいですが、プレースホールドを含まないいくつかの事柄にも役立ちます。

たとえば、最近手がけた少しのコードでは、2つの変数を除算する必要があり、除数がゼロになる可能性がありました。

c = a / b

明らかに、bがゼロの場合、ZeroDivisionErrorを生成します。この特定の状況では、bがゼロの場合、cをゼロのままにすることが望ましい動作だったので、次のコードを使用しました。

try:
    c = a / b
except ZeroDivisionError:
    pass

別の、あまり標準的ではない使用法は、デバッガーにブレークポイントを配置するための便利な場所としてです。たとえば、for ... inステートメントの20回目の反復で、少しコードをデバッガーに割り込ませたいと思っていました。そう:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

パスにブレークポイントを設定します。


def bar(): pass「絶対に何も」しない。それでもNone暗黙的にを返します。
chepner 2016

1
デバッガに関する見落としがちですが、重要なポイントです。+1
タワー

10

「そのまま」使用できる一般的な使用例は、タイプを作成するためにクラスをオーバーライドすることです(それ以外はスーパークラスと同じです)。たとえば、

class Error(Exception):
    pass

したがって、Error例外を発生させてキャッチすることができます。ここで重要なのは、内容ではなく、例外のタイプです。


6

passPythonでは基本的に何もしませんが、コメントとは異なり、インタプリタによって無視されません。したがって、プレースホルダーにすることで、多くの場所でそれを利用できます。

1:クラスで使用可能

   class TestClass: 
      pass

2:ループおよび条件付きステートメントで使用できます。

   if (something == true):  # used in conditional statement
       pass

   while (some condition is true):  # user is not sure about the body of the loop
       pass

3:関数で使用できます:

   def testFunction(args): # programmer wants to implement the body of the function later
       pass

passプログラマーが現時点で実装を望まないが、後で使用できる特定のクラス/関数/条件ステートメントを作成したい場合に主に使用されます。Pythonインタプリタは空白または実装されていないクラス/関数/条件ステートメントを許可しないため、エラーが発生します。

IndentationError:インデントされたブロックが期待されます

pass このようなシナリオで使用できます。


5

パスNOP(No Operation)操作意味すると言うことができます。この例の後で、明確な画像が得られます:-

Cプログラム

#include<stdio.h>

void main()
{
    int age = 12;

    if( age < 18 )
    {
         printf("You are not adult, so you can't do that task ");
    }
    else if( age >= 18 && age < 60)
    {
        // I will add more code later inside it 
    }
    else
    {
         printf("You are too old to do anything , sorry ");
    }
}

これをPythonでどのように記述するか:-

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

else:

    print "You are too old to do anything , sorry "

しかし、elifの後にインデントされたブロックが必要なため、コードはエラーになります。passキーワードの役割は次のとおりです。

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

    pass

else:

    print "You are too old to do anything , sorry "

さて、あなたにはそれが明らかだと思います。


1
&&オペレータは、Pythonには存在しません
イバン・C.

5

私はテストをスタブするときにそれを使いたいです。何をテストしたいかはよく知っていますが、その方法がよくわかりません。テストの例は、sebastian_oeが示唆したように見えます

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

これを行わないことを強くお勧めします。このような空のテストは簡単に忘れることができます。よりよい常にフェイルショートコードなどとスタブテストにassert Falseまたはassert 0この方法あなたは常にあなたが実装を追加する必要があり注目されるであろう:)
jave.web

4

passステートメントは何もしません。文が構文的に必要であるがプログラムはアクションを必要としない場合に使用できます。


4

正直なところ、公式のPythonドキュメントはそれを非常によく説明し、いくつかの例を提供していると思います:

パス文は何もしません。文が構文的に必要であるがプログラムはアクションを必要としない場合に使用できます。例えば:

>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...

これは通常、最小限のクラスを作成するために使用されます。

>>> class MyEmptyClass: ... pass ...

新しいコードで作業しているときの関数または条件付きボディのプレースホルダーとして使用できる別の場所パスは、より抽象的なレベルで考え続けることができるようにします。パスは黙って無視されます。

>>> def initlog(*args): ... pass # Remember to implement this! ...


0

本が言ったように、私はこれを一時的なプレースホルダーとしてのみ使用します、すなわち、

# code that does something to to a variable, var
if var == 2000:
    pass
else:
    var += 1

後でシナリオに記入します var == 2000


3
何の本を話してるの?

申し訳ありません...ガイド、OPが言及
Cameron Sparr

0

Passは、ignoreを参照します。...単純です....指定された条件がtrueで次のステートメントがpassの場合、その値または反復を無視して、次の行に進みます.....例

For i in range (1,100):
    If i%2==0:
                  Pass 
    Else:
                  Print(i)

出力:1から100までのすべての奇数を出力します

これは、偶数の係数がゼロに等しいため、その数を無視して次の数に進むためです。奇数の係数はゼロに等しくないため、ループのその他の部分が実行され、その出力が出力されます。


私が取得しますSyntaxError。また、これはpass単に行うことができるので、適切な使用法ではありませんfor i in range(1,100):print(i)if i%2else""
MilkyWay90

-1

これは、複数のデータタイプ(Rでそれと呼んでいるものですが、命名法が間違っていると申し訳ありません)のリストから特定のデータを抽出し、整数/数値のみを抽出し、文字データは抽出しない例です。 。

データは次のようになりました。

>>> a = ['1', 'env', '2', 'gag', '1.234', 'nef']
>>> data = []
>>> type(a)
<class 'list'>
>>> type(a[1])
<class 'str'>
>>> type(a[0])
<class 'str'>

私はすべてのアルファベット文字を削除したかったので、データをサブセット化してアルファベットデータを「渡す」ことでマシンにそれを実行させました。

a = ['1', 'env', '2', 'gag', '1.234', 'nef']
data = []
for i in range(0, len(a)):
    if a[i].isalpha():
        pass
    else:
        data.append(a[i])
print(data)
['1', '2', '1.234']

-1

Pythonのpassステートメントは、ステートメントが構文的に必要であるが、コマンドやコードを実行したくない場合に使用されます。

passステートメントはnull操作です。実行しても何も起こりません。パスは、コードが最終的に行く場所でも役立ちますが、まだ作成されていません(たとえば、スタブなど)。

`例:

#!/usr/bin/python

for letter in 'Python': 
   if letter == 'h':
      pass
      print 'This is pass block'
   print 'Current Letter :', letter

print "Good bye!"

これにより、次の結果が生成されます。

Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!

上記のコードは、letterの値が 'h'の場合、ステートメントまたはコードを実行しません。passステートメントは、コードブロックを作成したときに役立ちますが、不要になりました。

その後、ブロック内のステートメントを削除できますが、コードの他の部分に干渉しないように、ブロックにpassステートメントを残すことができます。


-1

パスは、Pythonのインデントエラーを回避するために使用されます。c、c ++、javaなどの言語を使用する場合、次のような中かっこがあります。

 if(i==0)
 {}
 else
 {//some code}

しかし、Pythonでは中括弧の代わりにインデントを使用したため、そのようなエラーを回避するためにpassを使用しています。クイズをプレイしていて、

 if(dont_know_the_answer)
      pass

プログラム例、

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.