我在学习Python的过程中,我已经到了关于pass语句的部分。我正在使用的指南将其定义为通常用作占位符的空语句。
但我还是不太明白这是什么意思。pass语句将被使用的简单/基本情况是什么?为什么需要它?
我在学习Python的过程中,我已经到了关于pass语句的部分。我正在使用的指南将其定义为通常用作占位符的空语句。
但我还是不太明白这是什么意思。pass语句将被使用的简单/基本情况是什么?为什么需要它?
当前回答
如果你想导入一个模块,如果它存在,并且忽略导入它,如果该模块不存在,你可以使用下面的代码:
try:
import a_module
except ImportError:
pass
# The rest of your code
如果您避免编写pass语句并继续编写其余代码,则会引发IndentationError,因为打开except块后的行没有缩进。
其他回答
如果你想导入一个模块,如果它存在,并且忽略导入它,如果该模块不存在,你可以使用下面的代码:
try:
import a_module
except ImportError:
pass
# The rest of your code
如果您避免编写pass语句并继续编写其余代码,则会引发IndentationError,因为打开except块后的行没有缩进。
pass语句什么也不做。当语法上需要语句,但程序不需要操作时,可以使用它。
Pass只是空的表示代码。
例如,pass用于创建一个空类或函数,如下所示:
class Test:
pass
def test():
pass
但是,如果一个类或函数真的没有任何东西,甚至通过如下所示:
class Test:
# pass
def test():
# psss
出现如下错误:
SyntaxError:解析时意外的EOF
正如我之前所说,pass只是空的指示代码,所以如果在pass之后有一些代码,代码的工作方式如下所示:
class Test:
pass
x = "Hello World"
def test():
pass
return "Hello World"
print(Test.x) # Hello World
print(test()) # Hello World
除了用作未实现函数的占位符外,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,但在其他情况中没有设置。如果不使用pass,未来的程序员可能会将flag = True移到条件之外,从而在所有情况下设置flag。
另一种情况是经常出现在文件底部的样板函数:
if __name__ == "__main__":
pass
在某些文件中,最好将其与pass一起保留,以便稍后更容易地进行编辑,并明确表示当文件单独运行时不期望发生任何事情。
最后,正如在其他回答中提到的,当异常被捕获时,什么都不做是很有用的:
try:
n[i] = 0
except IndexError:
pass
Python在语法上要求代码块(在if, except, def, class等之后)不能为空。然而,空代码块在各种不同的上下文中都很有用,比如下面的例子,这是我见过的最常见的用例。
因此,如果在代码块中不希望发生任何事情,则需要一个传递以使该代码块不产生IndentationError。或者,任何语句(包括一个要求值的项,如Ellipsis字面量…)可以使用字符串(通常是docstring),但该传递清楚地表明,实际上不应该发生任何事情,也不需要实际计算并(至少暂时)存储在内存中。
Ignoring (all or) a certain type of Exception (example from xml): try: self.version = "Expat %d.%d.%d" % expat.version_info except AttributeError: pass # unknown Note: Ignoring all types of raises, as in the following example from pandas, is generally considered bad practice, because it also catches exceptions that should probably be passed on to the caller, e.g. KeyboardInterrupt or SystemExit (or even HardwareIsOnFireError – How do you know you aren't running on a custom box with specific errors defined, which some calling application would want to know about?). try: os.unlink(filename_larry) except: pass Instead using at least except Error: or in this case preferably except OSError: is considered much better practice. A quick analysis of all Python modules I have installed gave me that more than 10% of all except ...: pass statements catch all exceptions, so it's still a frequent pattern in Python programming. Deriving an exception class that does not add new behaviour (e.g., in SciPy): class CompileError(Exception): pass Similarly, classes intended as abstract base class often have an explicit empty __init__ or other methods that subclasses are supposed to derive (e.g., pebl): class _BaseSubmittingController(_BaseController): def submit(self, tasks): pass def retrieve(self, deferred_results): pass Testing that code runs properly for a few test values, without caring about the results (from mpmath): for x, error in MDNewton(mp, f, (1,-2), verbose=0, norm=lambda x: norm(x, inf)): pass In class or function definitions, often a docstring is already in place as the obligatory statement to be executed as the only thing in the block. In such cases, the block may contain pass in addition to the docstring in order to say “This is indeed intended to do nothing.”, for example in pebl: class ParsingError(Exception): """Error encountered while parsing an ill-formed datafile.""" pass In some cases, pass is used as a placeholder to say “This method/class/if-block/... has not been implemented yet, but this will be the place to do it”, although I personally prefer the Ellipsis literal ... in order to strictly differentiate between this and the intentional “no-op” in the previous example. (Note that the Ellipsis literal is a valid expression only in Python 3) For example, if I write a model in broad strokes, I might write def update_agent(agent): ... where others might have def update_agent(agent): pass before def time_step(agents): for agent in agents: update_agent(agent) as a reminder to fill in the update_agent function at a later point, but run some tests already to see if the rest of the code behaves as intended. (A third option for this case is raise NotImplementedError. This is useful in particular for two cases: Either “This abstract method should be implemented by every subclass, and there isn't a generic way to define it in this base class”, or “This function, with this name, is not yet implemented in this release, but this is what its signature will look like”)