在Python解释器中,下划线变量的值意外地发生了改变

3

我正在尝试创建一个Python模块,使我能够像map(_ + 2, range(10))这样编写有效的语句,只是为了好玩,但有一种奇怪的行为我不知道如何处理。我当前的实现方式是:

class EasyLambda(object):
    def __add__(self, other):
        return lambda val: val + other

_ = EasyLambda()

每个运算符都有其自己的功能。这是一个简单的实现,我将稍后改进它,以使诸如_.lower() + '.html'的操作成为可能。问题在于,每次调用一个魔法方法时,Python似乎都会用该方法返回的新值替换self,而在本例中这个值是一个 lambda 函数。
>>> from mymodule import _
>>> print _
<func.EasyLambda object at 0x2e4ae90>

>>> add2 = _ + 2
>>> print add2, _
<function <lambda> at 0x2e551b8> <func.EasyLambda object at 0x2e13e90>

>>> add2(4)
6

>>> print add2, _
<function <lambda> at 0x2e551b8> 6    # WTF?

>>> print _, type(_)
6 <type 'int'>

>>> _ + 4
10

>>> _
10    # WTF??

>>> 2 + 2
4

>>> _
6    # WTF???

我真的不知道这里发生了什么。我应该如何解决这个问题并使我的_对象表现正常?


5
在 shell 中,_ 被用来存储最后一个计算结果......不要对 _ 做任何操作 - 只需在 IDLE/交互式提示符中输入 2+2,然后键入 _ - 您将获得4。 - Jon Clements
亲爱的主啊--我会再次测试并编辑我的测试。 - Lucas Sampaio
5
在交互式 shell 之外,通常用作 ugettext 和本地化的快捷名称……我认为最简单的方法是避免使用那个名称开始 :) - Jon Clements
这不是用于严肃用途的,只是为了好玩,但是谢谢你的建议 =D - Lucas Sampaio
好的,我有点尴尬 =S 你能把这个放在一个答案里,@JonClements,尽快关闭这个问题吗? - Lucas Sampaio
1
好的 - 我已经完成了...祝你的项目顺利... - Jon Clements
1个回答

5
_被交互式解释器用于存储最后一个评估结果。每次尝试执行操作时,您无意中都会覆盖_。此外,请注意_经常用作uggettext等的快捷方式。现在避免使用_是最简单的解决方案...
感谢thefourtheye指出了Python文档中相关部分,其中规定:

特殊标识符_用于交互式解释器中存储上次评估的结果; 它存储在__builtin__模块中。不在交互模式下时,_没有特殊含义且未定义。请参阅导入语句一节。

注:名称_通常与国际化一起使用;有关此约定的更多信息,请参阅gettext模块的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接