如何使用pass语句?

时间:2012-12-14 20:59:30

标签: python

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

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

15 个答案:

答案 0 :(得分:392)

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

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

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

如果您遗漏pass,代码将无法运行。

然后你会得到一个:

IndentationError: expected an indented block

总而言之,pass语句没有什么特别之处,但它可以充当占位符,如此处所示。

答案 1 :(得分:187)

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

因此,如果代码块中没有任何内容发生,则此类块需要pass才能生成IndentationError。或者,可以使用任何语句(仅包括要评估的术语,如Ellipsis文字...或字符串,通常是文档字符串),但pass明确表示确实什么都不应该发生,并且不需要实际评估和(至少暂时)存储在内存中。

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

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

    注意:忽略所有类型的加注,如以下pandas中的示例所示,通常被认为是不好的做法,因为它还会捕获可能传递给调用方的异常,例如KeyboardInterruptSystemExit(甚至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作为强制语句作为块中唯一的内容执行。在这种情况下,该块可能还包含pass 以及文档字符串,以便说明“这确实是无意义的。”,例如在pebl:< / p>

    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函数,但是已经运行了一些测试以查看代码的其余部分是否按预期运行。 (这种情况的第三个选项是raise NotImplementedError。这特别适用于两种情况:“这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它“”此版本的此函数尚未在此版本中实现,但这是其签名看起来像“

答案 2 :(得分:19)

除了用作未实现函数的占位符之外,pass可用于填写if-else语句(“Explicit优于隐式”。)

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


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

if __name__ == "__main__":
    pass

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


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

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

答案 3 :(得分:18)

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

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

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

def bar():
    pass

表示“如果我调用功能栏(),则绝对不做任何事。”

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

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

c = a / b
显然,如果b为零,

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

try:
    c = a / b
except ZeroDivisionError:
    pass

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

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

传递断点。

答案 4 :(得分:10)

可以“按原样”使用的一个常见用例是覆盖一个类只是为了创建一个类型(在其他方面与超类相同),例如。

class Error(Exception):
    pass

因此,您可以提出并捕获Error例外情况。这里重要的是例外的类型,而不是内容。

答案 5 :(得分:6)

如果您不知道将要放入某个代码块中的内容

try:
   int(someuserinput)
except ValueError:
   pass

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

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

答案 6 :(得分:5)

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

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

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

  

IndentationError:预期缩进块

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

答案 7 :(得分:4)

老实说,我认为official Python docs描述得很好并提供了一些例子:

  

传递语句不执行任何操作。当语法需要语句但程序不需要操作时,可以使用它。例如:

     

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

     

这通常用于创建最小类:

     

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

     

当您处理新代码时,可以使用 pass 作为函数或条件体的占位符,允许您在更抽象的层次上思考。静默忽略传递

     

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

答案 8 :(得分:3)

pass语句什么都不做。当语法需要语句但程序不需要操作时,可以使用它。

答案 9 :(得分:2)

正如书中所说,我只是将它用作临时占位符,即

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

然后填写var == 2000

的方案

答案 10 :(得分:0)

以下是我从列表中提取特定数据的示例,其中我有多种数据类型(这就是我在R中称之为 - 抱歉,如果它是&#39; s错误的命名法)我想只提取整数/数字和非字符数据。

数据看起来像:

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

我想删除所有按字母顺序排列的字符,所以我让机器通过对数据进行子集化来实现,并且&#34;传递&#34;字母数据:

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']

答案 11 :(得分:0)

当语法需要语句但您不希望执行任何命令或代码时,将使用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!

如果字母的值是&#39; h&#39;,前面的代码不会执行任何语句或代码。创建代码块但不再需要时,pass语句很有用。

然后你可以删除块内的语句,但是让块保留一个pass语句,这样它就不会干扰代码的其他部分。

答案 12 :(得分:0)

Pass引用了ignore ....就这么简单....如果给定条件为true,并且下一条语句通过,它将忽略该值或迭代并继续执行下一行..... 例子

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

输出:打印1-100之间的所有奇数

这是因为偶数的模数等于零,因此它会忽略该数字并继续到下一个数字,因为奇数模数不等于零,则执行循环的其他部分并打印循环

答案 13 :(得分:0)

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

答案 14 :(得分:0)

如果要导入模块(如果存在),而忽略导入,如果该模块不存在,则可以使用以下代码:

try:
    import a_module
except ImportError:
    pass
#rest of your code

如果您避免编写pass语句并继续编写其余代码,则将引发IndentationError,因为在打开except块后的行未缩进