“单下划线”的目的是什么_&引用;Python中的变量?
在本代码中,的“单下划线”的目的是什么_&引用;Python中的变量?,python,variables,naming-conventions,metasyntactic-variable,Python,Variables,Naming Conventions,Metasyntactic Variable,在本代码中,的之后的\uu是什么意思 if tbh.bag: n = 0 for _ in tbh.bag.atom_set(): n += 1 它只是一个变量名,在python中,对一次性变量使用是一种惯例。它只是表明循环变量实际上没有被使用。\uu在Python中有三种主要的常规用法: 将最后执行的表达式的结果保存在交互式 口译员会议(见附件)。这一先例是由标准的CPython制定的 口译员和其他口译员也纷纷效仿 有关i18n中的翻译查找(请参阅 例如,文
之后的\uu
是什么意思
if tbh.bag:
n = 0
for _ in tbh.bag.atom_set():
n += 1
它只是一个变量名,在python中,对一次性变量使用
是一种惯例。它只是表明循环变量实际上没有被使用。\uu
在Python中有三种主要的常规用法:
将最后执行的表达式的结果保存在交互式
口译员会议(见附件)。这一先例是由标准的CPython制定的
口译员和其他口译员也纷纷效仿
有关i18n中的翻译查找(请参阅
例如,文档),如代码中的
raise forms.ValidationError(_("Please enter a correct username"))
作为通用“一次性”变量名:
表示该部分
故意忽略函数的结果(从概念上讲,它被丢弃),如以下代码所示:
label, has_label, _ = text.partition(':')
def callback(_):
return True
作为函数定义的一部分(使用def
或lambda
),其中
签名是固定的(例如通过回调或父类API),但是
这个特定的函数实现不需要所有的
参数,如代码中所示:
label, has_label, _ = text.partition(':')
def callback(_):
return True
[很长一段时间,这个答案没有列出这个用例,但正如前面提到的,它经常出现,值得明确列出。]
此用例可能与翻译查找用例冲突,因此有必要避免在任何也将其用于i18n翻译的代码块中使用\uu
作为一次性变量(许多人喜欢使用双下划线,\u
,正是出于这个原因,将其作为一次性变量)
linter经常认识到这个用例。例如,year,month,day=date()
将在代码后面未使用day
时发出lint警告。如果确实不需要day
,那么修复方法是写入年、月、u=date()
。与lambda函数相同,lambda arg:1.0
创建一个需要一个参数但不使用它的函数,这将被lint捕获。解决方法是编写lambda:1.0
。未使用的变量通常隐藏错误/输入错误(例如,在下一行中设置day
,但使用dya
)
在Python中,下划线
被视为“我不在乎””或“一次性”变量
- python解释器将最后一个表达式值存储到名为
的特殊变量中
>>> 10
10
>>> _
10
>>> _ * 3
30
- 下划线
也用于忽略特定值。如果不需要特定值或未使用这些值,只需将这些值指定给下划线即可。
>>> 10
10
>>> _
10
>>> _ * 3
30
解包时忽略一个值
忽略索引
在Python中使用下划线有5种情况
用于在解释器中存储最后一个表达式的值
用于忽略特定值。(所谓“我不在乎”)
赋予变量或函数名特殊的含义和函数
用作“国际化(i18n)”或“本地化(l10n)”功能
分隔数字文字值的数字
这是一篇很好的文章,其中有作者的示例。就Python语言而言,\uu
没有特殊意义。它与\u foo
、foo
或\u f\u o\u
一样有效
的任何特殊含义纯粹是按照惯例。有几种情况很常见:
- 不打算使用变量,但语法/语义需要名称时的伪名称
# iteration disregarding content
sum(1 for _ in some_iterable)
# unpacking disregarding specific elements
head, *_ = values
# function disregarding its argument
def callback(_): return True
- 许多repl/shell将最后一个顶级表达式的结果存储到
内置项中。
在交互式口译员中使用特殊标识符\uu
来存储上次评估的结果;它存储在内置的模块中。当不处于交互模式时,\u
没有特殊含义,也没有定义。[]
由于名称的查找方式,除非被全局或本地的\uu
定义所遮蔽,否则裸\u
指的是内置项
>>> 42
42
>>> f'the last answer is {_}'
'the last answer is 42'
>>> _
'the last answer is 42'
>>> _ = 4 # shadow ``builtins._`` with global ``_``
>>> 23
23
>>> _
4
注意:某些shell,如ipython
不分配给内置程序。\u
而是特例\u
- 在国际化和本地化上下文中,
\u
用作主要翻译功能的别名
返回基于当前全局域、语言和区域设置目录的消息本地化翻译。此函数在本地名称空间中通常别名为z()(请参见下面的示例)
请参见您的案例,在len(tbh.bag.atom_set())
(如果返回值具有\uu len_uu
方法)或sum(tbh.bag.atom_set()中的u为1)
pylint
中的
虚拟变量名的另一个选项是变量名的前缀虚拟
。将此前缀与pylint
一起使用,使pylint
不会发出警告。此外,您还可以为pylint
配置虚拟变量模式,以适应\uuu
之类的情况。您的意思是它不代表最后返回的值吗?@steve仅在python外壳中使用,类似于序言中的使用。类似于Matlab中的使用。请注意,在cpython外壳中,如果您明确定义\uu
,它将永久停止保留上一个表达式的输出值。这看起来非常不一致,Python语言标准需要解决这个问题。他们应该将\uu
定义为一个一次性名称,并阻止它被用作真正的标识符。您能否解释一下它在函数调用中的工作原理,例如:raise forms.ValidationError(quo;请输入正确的用户名”)。我在Django代码中看到了这一点,但不清楚发生了什么。这就是用法2