如何在Python中使用Pass语句

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

我仍然不完全明白这是什么意思。 有人能告诉我一个简单/基本的情况, pass将被使用,为什么需要?

假设你正在用一些你不想实现的方法来devise一个新的类。

 class MyClass(object): def meth_a(self): pass def meth_b(self): print "I'm meth_b" 

如果你遗漏pass ,代码将不会运行。

你会得到一个

 IndentationError: expected an indented block 

总而言之, pass声明并没有什么特别之处,但是可以像前面所显示的那样充当占位符。

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

因此,如果在代码块中不应该发生任何事情,则这样的块需要pass以不产生IndentationError 。 或者,可以使用任何语句(包括仅用于评估的术语,比如Ellipsis字面值或string,通常是文档string),但是pass表明确实没有什么应该发生,并且不需要被实际评估并且(至less暂时)存储在存储器中。

  • 忽略(全部或)特定types的Exception (例如来自xml ):

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

    注意:忽略所有types的引发,就像下面的pandas示例一样,通常被认为是不好的做法,因为它也捕获应该传递给调用者的exception,例如KeyboardInterruptSystemExit (甚至是HardwareIsOnFireError – 你怎么知道你没有运行一个定义了特定错误的自定义框,这是一些调用应用程序想知道的?)。

     try: os.unlink(filename_larry) except: pass 

    相反,至lessexcept Error:或在这种情况下,最好except OSError:被认为是更好的做法。 对我所安装的所有python模块的快速分析给了我超过10%, except ...: pass语句捕获所有的exception,所以它仍然是python编程中的一个频繁的模式。

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

     class CompileError(Exception): pass 

    同样,作为抽象基类的类通常有一个明确的空__init__或其他子类应该派生的方法。 (如pebl

     class _BaseSubmittingController(_BaseController): def submit(self, tasks): pass def retrieve(self, deferred_results): pass 
  • testing代码正确运行几个testing值,而不关心结果(从mpmath ):

     for x, error in MDNewton(mp, f, (1,-2), verbose=0, norm=lambda x: norm(x, inf)): pass 
  • 在类或函数定义中,通常已经有一个文档string作为块中唯一要执行的强制性语句 。 在这种情况下,为了说“这实际上是无所作为的”,该块可以包含文档string之外的 pass ,例如在pebl

     class ParsingError(Exception): """Error encountered while parsing an ill-formed datafile.""" pass 
  • 在某些情况下, pass被用作占位符来表示“这个方法/类/ if-block / …还没有被实现,但是这将成为这样做的地方”,虽然我个人更喜欢Ellipsis字面值...为了严格区分这和前面例子中的故意“不操作”。 例如,如果我用广泛的笔触写一个模型,我可能会写

     def update_agent(agent): ... 

    别人可能有的地方

     def update_agent(agent): pass 

    之前

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

    作为提醒,稍后再填写update_agent函数,但是已经运行了一些testing,看看代码的其他部分是否按预期工作。 (这种情况的第三个select是raise NotImplementedError ,这在两种情况下尤其有用: “这个抽象方法应该由每个子类实现,没有在这个基类中定义它的通用方法” ,或者“这个函数,这个名字,在这个版本中还没有实现,但是这个签名看起来就是这个样子“

除了用作未实现函数的占位符, 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在两个特别提到的情况下被设置,但不在else 。 如果不使用pass ,未来的程序员可能会将flag = True移到条件之外,从而在所有情况下设置flag


另一个案例是在文件底部经常看到的样板function:

 if __name__ == "__main__": pass 

在某些文件中,可能会很高兴在那里保留pass ,以便稍后进行更简单的编辑,并且明确指出当文件独立运行时不会发生任何事情。


最后,正如其他答案中所提到的,当发生exception时,什么也不做是有用的:

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

最好,最准确的方法是明确告诉翻译者什么都不做。 以下面的代码相同的方式:

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

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

 def bar(): pass 

意思是“如果我打电话给function栏(),什么都不要做”。

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

例如,在最近的一些代码中,有必要将两个variables分开,除数可能为零。

 c = a / b 

显然,如果b是零,会产生ZeroDivisionError。 在这种特殊情况下,将c设置为零是b为0的情况下的期望行为,所以我使用了下面的代码:

 try: c = a / b except ZeroDivisionError: pass 

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

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

与通过断点。

一个常见的使用情况是可以“按原样”使用的,就是重写一个类来创build一个types(否则就像超类一样),例如

 class Error(Exception): pass 

所以你可以引发并捕获Errorexception。 这里重要的是例外的types,而不是内容。

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

 try: int(someuserinput) except ValueError: pass 

我也喜欢在testing时使用它。 我经常意识到我会做什么,但是不知道如何去做。 testing示例看起来像sebastian_oebuild议的

 class TestFunctions(unittest.TestCase): def test_some_feature(self): pass def test_some_other_feature(self): pass 

在Python中pass基本不做任何事情,但不像一个评论它不被解释器忽略。 所以你可以在很多地方利用它作为一个占位符:

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:可用于function:

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

当程序员现在不想执行,但仍然想要创build一个可以在以后使用的某个类/函数/条件语句时,主要使用pass 。 由于Python解释器不允许空白或未实现的类/函数/条件语句,它会给出错误:

IndentationError:预期一个缩进块

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 "); } } 

现在你将如何用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 " 

现在我想对你很清楚。

正如书中所说,我只是把它当作临时占位符,

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

然后再填写var == 2000的场景

下面是一个例子,我从一个列表中提取了具有多种数据types的特定数据(这就是我在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'] 

Python中的pass语句用于语法需要的语句,但不想执行任何命令或代码。

pass语句是一个空操作; 执行时没有任何反应。 这个通行证在你的代码最终会去的地方也是有用的,但是还没有被写入(例如在stub中):

`实施例:

 #!/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”,则上述代码不执行任何语句或代码。 通过语句在创build代码块时非常有用,但不再需要。

然后你可以删除块内部的语句,但让块保留一个通过语句,以便它不会干扰代码的其他部分。