我正在学习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声明没有任何特别之处,但它可以充当占位符,如此处所示.
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,通常被认为是不好的做法,因为它还会捕获可能传递给调用者的异常,例如KeyboardInterrupt或SystemExit(或者甚至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)
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)
现在我想你很清楚了。
如果你不知道你要放在某个代码块中
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)
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 可以在这种情况下使用.