_(下划线)变量的值在Python解释器中意外更改

时间:2014-01-18 13:21:54

标签: python metaprogramming magic-methods

我正在尝试在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???

我不知道这里发生了什么,真的。如何解决此问题并使我的_ object按预期运行?

1 个答案:

答案 0 :(得分:5)

交互式解释器使用

_来存储最后评估的结果。每当你尝试做某事时,你就会无意中覆盖了_。另请注意,_经常被用作uggettext和类似的快捷方式。最简单的解决方案是暂时避免_ ...

感谢thefourtheye指出Python documentation中指出的相关部分:

  

在交互式解释器中使用特殊标识符_来存储上次评估的结果;它存储在__builtin__模块中。如果不处于交互模式,_没有特殊含义,也没有定义。请参阅import语句。

     

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