如何在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有语法要求,代码块(在if
, except
, def
, class
等之后)不能为空。 空代码块在各种不同的上下文中都是有用的,例如下面的例子,这是我见过的最常见的用例。
因此,如果在代码块中不应该发生任何事情,则这样的块需要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,例如KeyboardInterrupt
或SystemExit
(甚至是HardwareIsOnFireError
– 你怎么知道你没有运行一个定义了特定错误的自定义框,这是一些调用应用程序想知道的?)。try: os.unlink(filename_larry) except: pass
相反,至less
except 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
所以你可以引发并捕获Error
exception。 这里重要的是例外的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代码块时非常有用,但不再需要。
然后你可以删除块内部的语句,但让块保留一个通过语句,以便它不会干扰代码的其他部分。