这段代码中的_after是什么意思?for
_
for
if tbh.bag: n = 0 for _ in tbh.bag.atom_set(): n += 1
_在 Python 中有 3 个主要的常规用途:
在交互式解释器会话中保存最后执行的表达式的结果(请参阅文档)。这个先例是由标准 CPython 解释器开创的,其他解释器也纷纷效仿
对于 i18n 中的翻译查找(例如,参见 gettext 文档),如代码中所示
raise forms.ValidationError(_("Please enter a correct username"))
作为通用的“一次性”变量名:
表示函数结果的一部分被故意忽略(从概念上讲,它被丢弃了。),如代码所示:
label, has_label, _ = text.partition(':')
作为函数定义的一部分(使用def或lambda),其中签名是固定的(例如,通过回调或父类 API),但这个特定的函数实现不需要所有参数,如下代码所示:
def
lambda
def callback(_): return True
此用例可能与翻译查找用例发生冲突,因此有必要避免_在任何也将其用于 i18n 翻译的代码块中用作一次性变量(许多人更喜欢双下划线__, 作为他们的一次性变量这个原因)。
__
Linter 通常会识别此用例。例如,如果稍后在代码中未使用,year, month, day = date()则会引发 lint 警告。day如果day确实不需要,解决方法是编写year, month, _ = date(). 与 lambda 函数相同,lambda arg: 1.0创建一个需要一个参数但不使用它的函数,它将被 lint 捕获。解决方法是编写lambda _: 1.0. 未使用的变量通常隐藏错误/错字(例如设置day但dya在下一行中使用)。
year, month, day = date()
day
year, month, _ = date()
lambda arg: 1.0
lambda _: 1.0
dya
Python 3.10 中添加的模式匹配功能将这种用法从“约定”提升为“语言语法”,其中match涉及语句:在匹配情况下,_是通配符模式,在这种情况下运行时甚至不会将值绑定到符号.
match
对于其他用例,请记住它_仍然是一个有效的变量名,因此仍将保持对象处于活动状态。在不希望这样做的情况下(例如释放内存或外部资源),显式del name调用将满足正在使用该名称的 linter, 并 立即清除对对象的引用。
del name