我正在学习Python,我已经到了关于pass
语句的部分。我正在使用的指南将其定义为Null
语句,通常用作占位符。
我仍然不完全明白这意味着什么。有人能告诉我一个简单/基本的情况,其中会使用pass
语句以及为什么需要它?
答案 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具有语法要求,即代码块(if
,except
,def
,class
等)不能为空。然而,空代码块在各种不同的上下文中都很有用,例如下面的示例,这是我见过的最常见的用例。
因此,如果代码块中没有任何内容发生,则此类块需要pass
才能生成IndentationError
。或者,可以使用任何语句(仅包括要评估的术语,如Ellipsis
文字...
或字符串,通常是文档字符串),但pass
明确表示确实什么都不应该发生,并且不需要实际评估和(至少暂时)存储在内存中。
忽略(全部或)某种类型的Exception
(例如来自xml
):
try:
self.version = "Expat %d.%d.%d" % expat.version_info
except AttributeError:
pass # unknown
注意:忽略所有类型的加注,如以下pandas
中的示例所示,通常被认为是不好的做法,因为它还会捕获可能传递给调用方的异常,例如KeyboardInterrupt
或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
在类或函数定义中,通常会将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)
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块后的行未缩进