##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> = Py和"_" = ##startInc {{{ Boern reply-to python-cn@googlegroups.com to python-cn@googlegroups.com date Sat, Jul 19, 2008 at 15:12 subject [CPyUG:59688] python 中单独一个 下划线 代表什么意思? }}} 在一些开源项目中,经常见到方法参数或者返回值 用一个 "_ " 来表示,不知道代表什么意 == i18N用 == {{{ Jiahua Huang reply-to python-cn@googlegroups.com to python-cn@googlegroups.com date Sat, Jul 19, 2008 at 16:12 subject [CPyUG:59696] Re: python 中单独一个 下划线 代表什么意思? }}} 能不能说得不要那么笼统, * 如果是像 Widget.set_text(_("Hello")) 的, * 那么这里的是 `_()` 函数调用,而不是方法参数或者返回值 用一个 "_ " 来表示 {{{ _() 函数调用是国际化用的, 会将给出参数的翻译文本, _("Hello") 会返回像是 "你好", Widget.set_text(_("Hello")) 会是 Widget.set_text("你好") }}} {{{ yuting cui reply-to python-cn@googlegroups.com to python-cn@googlegroups.com date Sat, Jul 19, 2008 at 21:14 }}} 嗯,为了和gnu的gettext常用语法兼容 * 一般都是这么定义的 {{{ import gettext _ = gettext.gettext }}} === 免冲突 === {{{ Iceberg reply-to python-cn@googlegroups.com to python-cn`CPyUG`华蟒用户组 date Sun, Jul 20, 2008 at 10:54 }}} * 大家的回复,方向都各不相同,包括私有方法(类似__init__之类)以及国际化时用的“_('...')”,都很有教育意义。而提问的楼主问的是`“方法参数或者返回值 用一个 "_ " 来表示”`,如果我没有理解错and楼主没有表达错的话,可能也包括想问以下这种情况(不过楼主自己不贴段代码来好好表达自己的问题,也真是不应该): {{{ _ , ext = os.path.splitext('/tmp/something.txt') }}} * 这里splitext()本来有两个返回值,但假设当前程序中只关于扩展名不关心其它内容,所以就会写一个名为`“_”`的变量把前面那段内容也“接住”,但随后不再使用。这种做法传统上有个术语叫`“假读”`。`“_”`在这里没有什么特别含义,本意应该是故意找一个没有描述性、以后也不会使用的名字,告诉读代码的人不用费心去理解,仅此而已。 * Python2.4的标准库difflib.py的1229行也有实际的例子。 * 不过也补充一个个人经验,就是由于`“_”`碰巧又是国际化时定义的一个函数,所以用上述假读的技巧时,产生的副作用是导致当前代码命名空间中的国际化函数`“_(...)”`失效。 * 小程序无所谓,涉及国际化的“大”程序会出乱子。我在使用Karrigell的时候是在这里吃过一次苦头的。 * 所以个人建议不要再这样使用`“_”`号了,至少得改用`“__”`之类的,避免冲突。 Iceberg === 理性用 === {{{ Leo Jay reply-to python-cn@googlegroups.com to python-cn@googlegroups.com date Sun, Jul 20, 2008 at 11:00 }}} 如果是我,我不会这样用。我会写: {{{ ext = os.path.splitext('/tmp/something.txt')[1] }}} 一定要写一个变量的时候,我会起一个明显一些的名字。 {{{ dummy, ext = os.path.splitext('/tmp/something.txt') }}} * `嗯嗯嗯!超級同意!再好的技巧不如明确的聲明!` ~ ZoomQuiet == 交互解 == {{{ DIrk reply-to python-cn@googlegroups.com to python-cn`CPyUG`华蟒用户组 date Mon, Jul 21, 2008 at 08:49 }}} 以下是正确解释: `在Python中,_ 符号一般代表着最近一条应该有返回值而没有被赋给某个变量的语句的执行结果`,比如以下语句: {{{ abc = 'xxx' cde = 'yyy' abc + cde }}} 这里的最后一条, `abc + cde`, 没有明确赋给哪个变量,Python 会自动将其赋给 `_` 这个特殊符号。 如果你改写成: {{{ abc = 'xxx' cde = 'yyy' fgh = abc + cde 就不会发生 _ = abc + cde 这样的赋值情况了。 }}} 大家可以试试。 其实,记得在Perl中有类似的用法。 === 补充 === * 补充一下,发生给_赋值的情况仅限于先前的返回值不是None. * 而且,这应该只是在Python命令交互模式才有效果,在脚本中为了避免隐藏bug,不存在这种情况。 DIrk ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]