如何使用pass语句?

Cap*_*cus 359 python

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

我仍然不完全明白这意味着什么.有人能告诉我一个简单/基本的情况,其中pass将使用该声明以及为什么需要它?

seb*_*_oe 438

假设您正在设计一个新类,其中包含一些您不想实现的方法.

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

    def meth_b(self):
        print "I'm meth_b"
Run Code Online (Sandbox Code Playgroud)

如果你遗漏了pass,代码将无法运行.

然后你会得到一个:

IndentationError: expected an indented block
Run Code Online (Sandbox Code Playgroud)

总而言之,该pass声明没有任何特别之处,但它可以充当占位符,如此处所示.

  • 我真的认为这不能正确回答这个问题.引用一种可能用于某物的东西,即使它是最常见的用途,与解释它的用途并不相同. (28认同)
  • 好吧,在这种情况下,人们也可以使用"返回",但略微失去清晰度. (15认同)
  • @Schilcote:我明白你的意思了.我在最初的答案中添加了另一个简短的解释.但是,我认为一个简单的例子通常有助于理解某个概念. (3认同)
  • @Anaphory的答案如下,说明了为什么这是重要的语言元素. (3认同)
  • 这解释了 `pass` 的一种用法,但我仍然不明白它的作用。这在生产代码中是否有用?从您的示例中,我会选择在我准备好实现它之前不添加该方法,或者我只会执行`return`。 (2认同)

Ana*_*ory 200

Python有句法的要求,即代码块(后if,except,def,class等等)不能为空.然而,空代码块在各种不同的上下文中都是有用的,例如下面的示例,这是我见过的最常见的用例.

因此,如果在代码块中不应该发生任何事情,pass则需要a 来使这样的块不产生IndentationError.或者,可以使用任何语句(包括只需要评估的术语,如Ellipsis文字...或字符串,通常是文档字符串),但是pass清楚地表明确实没有任何事情应该发生,并且不需要实际评估和(至少暂时)存储在内存中.

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

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown
    
    Run Code Online (Sandbox Code Playgroud)

    注意:忽略所有类型的加注,如下例所示pandas,通常被认为是不好的做法,因为它还会捕获可能传递给调用者的异常,例如KeyboardInterruptSystemExit(或者甚至HardwareIsOnFireError- 你怎么知道你不是在定义了特定错误的自定义框上运行,某些调用应用程序想知道哪些?).

    try:
        os.unlink(filename_larry)
    except:
        pass
    
    Run Code Online (Sandbox Code Playgroud)

    相反,至少使用except Error:或在这种情况下优选地except OSError:被认为是更好的实践.对我安装的所有python模块的快速分析告诉我,超过10%的except ...: pass语句都能捕获所有异常,因此它仍然是python编程中的常见模式.

  • 派生一个不添加新行为的异常类(例如scipy):

    class CompileError(Exception):
        pass
    
    Run Code Online (Sandbox Code Playgroud)

    类似地,用作抽象基类的类通常具有__init__子类应该派生的显式空或其他方法.(例如pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
    
    Run Code Online (Sandbox Code Playgroud)
  • 测试代码是否正确运行几个测试值,而不关心结果(来自mpmath):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
    
    Run Code Online (Sandbox Code Playgroud)
  • 在类或函数定义中,通常会使用docstring作为要执行的必需语句,作为块中的唯一内容.在这种情况下,pass 除了文档字符串之外,该块还可以包含"这确实是无意义的.",例如pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
    Run Code Online (Sandbox Code Playgroud)
  • 在某些情况下,pass用作占位符来说"这个方法/类/ if-block/...还没有实现,但这将是它的地方",尽管我个人更喜欢Ellipsis文字...以便在前面的例子中严格区分这个和故意的"无操作".例如,如果我用大笔书写一个模型,我可能会写

    def update_agent(agent):
        ... 
    
    Run Code Online (Sandbox Code Playgroud)

    别人可能有的地方

    def update_agent(agent):
        pass
    
    Run Code Online (Sandbox Code Playgroud)

    之前

    def time_step(agents):
        for agent in agents:
            update_agent(agent)
    
    Run Code Online (Sandbox Code Playgroud)

    作为update_agent稍后填写函数的提示,但是已经运行了一些测试以查看代码的其余部分是否按预期运行.(这种情况的第三种选择是raise NotImplementedError.这特别适用于两种情况:"这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它",或者"这个函数,带有此名称尚未在此版本中实现,但这是它的签名看起来像")


Mic*_*ter 21

除了用作未实现函数的占位符之外,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
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,可能会使用return而不是赋值,但在需要突变的情况下,这种方法效果最好.

pass这里的使用对于警告未来的维护者(包括你自己!)不要在条件语句之外放置冗余步骤特别有用.在上面的示例中,flag设置在两个特别提到的情况中,但不在else-case中.如果不使用pass,未来的程序员可能会转移flag = True到条件之外 - 因此flag所有情况下都会设置.


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

if __name__ == "__main__":
    pass
Run Code Online (Sandbox Code Playgroud)

在某些文件中,最好将其留在那里pass以便以后更容易编辑,并明确表示当文件独立运行时不会发生任何事情.


最后,正如其他答案中所提到的,捕获异常时什么都不做是很有用的:

try:
    n[i] = 0
except IndexError:
    pass
Run Code Online (Sandbox Code Playgroud)

  • 我认为前两个例子通常是不好的做法.关于第一个例子,你应该在`if ... elif`块之前设置`flag = False`,以防止模糊"NameError:name'flag'未定义"错误.关于第二个例子,似乎bizzar有加`如果__name__ =="__main__":pass`给广大的Python文件不办时直接执行(这是当你正在写模块化的代码的情况下)anythng.使用Python> = 3.0,你应该使用`...`(省略号)而不是`pass`来表示"稍后完成"块. (2认同)

Sch*_*ote 18

最好和最准确的思考pass方式是明确告诉解释者什么也不做.以同样的方式使用以下代码:

def foo(x,y):
    return x+y
Run Code Online (Sandbox Code Playgroud)

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

def bar():
    pass
Run Code Online (Sandbox Code Playgroud)

意思是"如果我打电话给功能栏(),绝对不做任何事."

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

例如,在我最近工作的一些代码中,有必要划分两个变量,并且除数可能为零.

c = a / b
Run Code Online (Sandbox Code Playgroud)

显然,如果b为零,则会产生ZeroDivisionError.在这种特殊情况下,将c保留为零是b为零的情况下所需的行为,因此我使用了以下代码:

try:
    c = a / b
except ZeroDivisionError:
    pass
Run Code Online (Sandbox Code Playgroud)

另一个不太标准的用法是为调试器设置断点的便利位置.例如,我想要一些代码在for ... in语句的第20次迭代中进入调试器.所以:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass
Run Code Online (Sandbox Code Playgroud)

通过断点.


小智 10

可以"按原样"使用的常见用例是覆盖类以创建类型(否则与超类相同),例如

class Error(Exception):
    pass
Run Code Online (Sandbox Code Playgroud)

所以你可以提出并捕获Error异常.这里重要的是例外的类型,而不是内容.


小智 7

您可以说pass意味着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 ");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你将如何用 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 "
Run Code Online (Sandbox Code Playgroud)

但是您的代码会出错,因为它需要在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 "
Run Code Online (Sandbox Code Playgroud)

现在我想你很清楚了。


dm0*_*514 6

如果你不知道你要放在某个代码块中

try:
   int(someuserinput)
except ValueError:
   pass
Run Code Online (Sandbox Code Playgroud)

我也喜欢在剔除测试时使用它.我经常知道我会测试什么,但不知道该怎么做.测试示例看起来像sebastian_oe建议的那样

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
Run Code Online (Sandbox Code Playgroud)


Ari*_*jit 5

pass在Python中基本上什么都不做,但与注释不同,它不会被解释器忽略.因此,您可以通过将其作为占位符来在很多地方利用它:

1:可以在课堂上使用

   class TestClass: 
      pass
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

3:可用于功能:

   def testFunction(args): # programmer wants to implement the body of the function later
       pass
Run Code Online (Sandbox Code Playgroud)

pass当程序员目前不想提供实现但仍希望创建某个可在以后使用的类/函数/条件语句时,主要使用它.由于Python解释器不允许空白或未实现的类/函数/条件语句,因此它会出错:

IndentationError:预期缩进块

pass 可以在这种情况下使用.