如何使用pass语句?


392

我正在学习Python,并且已经到达有关该pass语句的部分。我正在使用的指南将其定义Null为通常用作占位符的语句。

我仍然不完全明白那是什么意思。有人可以告诉我一个简单/基本的情况下使用该pass语句以及为什么需要该语句吗?


4
我从不需要在现实生活中这样做,但是我pass想当您想重写子类中的方法而不执行任何操作时,它会很有用。
kojiro 2014年


1
处理异常时非常方便。有时,异常意味着正常情况,只需要不同类型的处理即可。在这种情况下pass,该except块非常有用。
疯狂物理学家,2016年

Answers:


474

假设您正在使用尚未实现的某些方法设计一个新类。

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
@Schilcote:我明白你的意思。我在最初的回答中添加了另一个简短的解释。但是,我认为一个简单的示例通常有助于理解某个概念。
sebastian_oe 2014年

3
@Anaphory的答案在下面显示了为什么这是重要的语言元素。
约翰

2
这说明了的一种用法pass,但我仍然不太了解它的作用。生产代码中有此用途吗?从您的示例中,我选择仅在准备好实现该方法之前才添加该方法,否则我只会这样做return
theUtherSide

221

Python有句法的要求,即代码块(后ifexceptdefclass等等)不能为空。但是,空代码块在各种不同的上下文中都很有用,例如下面的示例,这是我见过的最常见的用例。

因此,如果在代码块中什么也不会发生,pass则需要a 来使该块不产生IndentationError。或者,可以使用任何语句(仅包括要求值的术语,如Ellipsis文字...或字符串,通常是文档字符串),但要说明的pass是,实际上不应该发生任何事情,不需要实际求值,并且(至少暂时)存储在内存中。

  • 忽略(全部或)某种类型的Exception(例如来自xml):

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

    注意:忽略所有类型的加薪,如下面的示例中所示pandas,通常被认为是不好的做法,因为它还会捕获可能应该传递给调用者的异常,例如KeyboardInterruptor 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
    
  • 在类或函数定义中,通常已经有一个文档字符串,作为强制性语句要作为块中唯一的内容执行。在这种情况下,该块可能包含pass 文档字符串之外的其他内容,以便说“这确实是无所事事。”,例如pebl

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • 在某些情况下,pass用作占位符时说“此方法/类/ if-block / ...尚未实现,但这将是执行此操作的地方”,尽管我个人更喜欢该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稍后再填写该功能,但已经运行了一些测试以查看其余代码是否按预期运行。(这种情况的第三个选项是raise NotImplementedError。这在两种情况下特别有用:“每个子类都应实现此抽象方法,在此基类中没有定义它的通用方法”,或“此函数具有此名称尚未在此版本中实现,但这是其签名将显示为的样子”


这是一个更好的答案!
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而不是分配,但是在需要突变的情况下,这种方法效果最佳。

使用passhere对警告将来的维护者(包括您自己!)不要在条件语句之外放置多余的步骤特别有用。在上面的示例中,flag在两个具体提到的情况下设置了,但在else-case中没有设置。如果不使用pass,将来的程序员可能会转移flag = True到该条件之外,因此flag所有情况下都应如此。


另一种情况是通常在文件底部看到样板函数:

if __name__ == "__main__":
    pass

在某些文件中,最好保留其中的内容pass,以便以后进行更轻松的编辑,并明确表明在单独运行文件时不会发生任何事情。


最后,如其他答案中所述,捕获异常时不执行任何操作可能很有用:

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

2
我认为前两个示例通常是不好的做法。关于第一个示例,您应该flag = Falseif ... elif 块之前设置,以防止稍后出现模糊的“ NameError:未定义名称'flag'”错误。关于第二个示例,似乎必须将pythonzar添加if __name__ == "__main__": pass到大多数直接执行时不执行任何操作的Python文件中(在编写模块化代码时就是这种情况)。在Python> = 3.0的情况下,您应该使用...(省略号)而不是pass表示“稍后完成”块。
ostrokach

18

最好和最准确的思考pass方式是明确告诉解释器不执行任何操作的方式。以同样的方式执行以下代码:

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

意思是“如果我调用函数foo(x,y),将标签x和y代表的两个数字相加并返回结果”,

def bar():
    pass

表示“如果我调用函数bar(),则绝对不执行任何操作。”

其他答案非常正确,但是对于一些不涉及占位的事情也很有用。

例如,在我最近使用的一些代码中,有必要将两个变量相除,并且除数可能为零。

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

1
关于调试器的观点经常被忽略,但很重要。+1
Wtower

10

可以“按原样”使用的常见用例是重写类,仅是为了创建类型(否则与超类相同),例如

class Error(Exception):
    pass

因此,您可以引发并捕获Error异常。这里重要的是异常的类型,而不是内容。


6

pass在Python中基本上不执行任何操作,但是与注释不同,解释器不会忽略它。因此,可以通过将其设置为占位符来在很多地方利用它:

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(无操作)操作。在此示例后,您将获得清晰的图片:

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 Falseassert 0这样你将永远是你指出应该添加一个实现:)
jave.web


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

传递是指忽略...。就这么简单....如果给定条件为真,并且下一条语句通过,它将忽略该值或迭代并继续执行下一行.....示例

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语句是一个空操作;执行时没有任何反应。在您的代码最终可以使用但尚未编写的地方(例如,在存根中),该传递也是有用的:

`示例:

#!/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!

如果字母的值为“ h”,则前面的代码不执行任何语句或代码。当您创建了代码块后,pass语句很有用,但不再需要。

然后,您可以删除该块内的语句,但让该块与pass语句一起保留,以免干扰代码的其他部分。


-1

pass用于避免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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.