双下划线__相比单下划线_更适合用作虚拟变量吗?
我有一个在Python 2.7中的例子,需要一个临时变量。我发现很多资料推荐使用一个单独的_
,就像下面这个例子:
directory = {key: [0 for _ in range(catnum)] for key in register}
我找到这个链接:http://docs.python-guide.org/en/latest/writing/style/#create-an-ignored-variable
这里是上面网址中的一段引用:
注意: 很多Python的风格指南推荐使用单个下划线
_
作为临时变量,而不是这里推荐的双下划线__
。问题是,_
通常用作gettext()函数的别名,并且在交互式提示符中用来保存最后一次操作的值。使用双下划线则同样清晰,几乎同样方便,并且避免了意外干扰这两种其他用法的风险。
我刚开始学习Python,想知道__
是否是被接受的惯例?有什么例子说明使用_
会导致问题吗?
directory = {key: [0 for __ in range(catnum)] for key in blasts}
2 个回答
根据我所看到的,现在大多数Python程序还是用_
作为一个占位符变量,而不是用双下划线__
。
不过,这里有一个可能会让人困惑的例子,正好在你提问的引用部分中描述了:
>>> 1+1
2
>>> _
2
>>>
这段话告诉我们,使用 _
可能会出问题的地方主要是在交互式解释器中,以及在任何把它当作 gettext.gettext
别名的代码中。这种情况在想要本地化文本的应用程序中很常见。这里有关于 gettext.gettext
的说明(我强调的部分):
根据当前的全局域、语言和区域目录,返回消息的本地化翻译。这个函数通常在本地命名空间中别名为 _()。
大多数程序像这样使用 gettext.gettext
:
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print _('This is a translatable string.')
这样你就不需要在每次想要翻译字符串的时候都输入 gettext
了。
不过,话说回来,我看到的 for _ in range(catnum)
比 for __ in range(catnum)
多得多。我想你应该知道使用 _
会不会造成问题;要么你知道自己在使用解释器,要么你知道你的应用程序把 _
当作 gettext.gettext
的别名。不过,使用 __
绝对更安全。
如果让我猜为什么大家不太使用 __
,我觉得可能是因为人们对 __
有些抵触,因为双下划线通常和 Python 的名字重整“私有”变量有关,而社区普遍认为这些变量是不必要的。不过这只是我的猜测。