我正在学习 Python 的过程中,我已经到达了有关 pass
语句的部分。我使用的指南将其定义为通常用作占位符的空语句。
我仍然不完全理解这意味着什么。将使用 pass
语句的简单/基本情况是什么?为什么需要它?
原文由 Capurnicus 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在学习 Python 的过程中,我已经到达了有关 pass
语句的部分。我使用的指南将其定义为通常用作占位符的空语句。
我仍然不完全理解这意味着什么。将使用 pass
语句的简单/基本情况是什么?为什么需要它?
原文由 Capurnicus 发布,翻译遵循 CC BY-SA 4.0 许可协议
Python has the syntactical requirement that code blocks (after if
, except
, def
, class
etc.) cannot be empty.然而,空代码块在各种不同的上下文中都很有用,例如下面的示例,这是我见过的最常见的用例。
因此,如果代码块中不应该发生任何事情,则需要 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 模块后,我发现超过 10% 的 except ...: pass
语句捕获所有异常,因此它仍然是 Python 编程中的常见模式。
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
pass
除了 文档字符串之外,以便说“这确实打算什么都不做。”,例如 pebl
: class ParsingError(Exception):
"""Error encountered while parsing an ill-formed datafile."""
pass
pass
用作占位符,表示“此方法/类/if-block/… 尚未实现,但这将是实现它的地方”,尽管我个人更喜欢 Ellipsis
文字 ...
以便严格区分这和前面示例中的故意“无操作”。 ( 请注意,省略号文字仅在 Python 3 中是有效表达式)例如,如果我粗略地写一个模型,我可能会写
def update_agent(agent):
...
其他人可能有的地方
def update_agent(agent):
pass
前
def time_step(agents):
for agent in agents:
update_agent(agent)
提醒您稍后填写 update_agent
函数,但已经运行一些测试以查看其余代码是否按预期运行。 (这种情况的第三个选项是 raise NotImplementedError
。这在两种情况下特别有用:要么 “这个抽象方法应该由每个子类实现,并且没有通用的方法来定义它基类” ,或 “这个函数,这个名字,还没有在这个版本中实现,但它的签名看起来像这样” )
原文由 Anaphory 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
假设您正在设计一个新类,其中包含一些您不想实现的方法。
如果您要省略
pass
,代码将不会运行。然后你会得到一个:
总而言之,
pass
语句没有做任何特别的事情,但它可以充当占位符,如此处所示。