2014-01-18 78 views
2

我试图在Python中创建一个模块,它允许我编写一个有效的句子,如map(_ + 2, range(10)),只是为了好玩,但有一个奇怪的行为,我不知道如何处理。我目前的实现是:Python解释器中_(下划线)变量的值意外变化

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

_ = EasyLambda() 

每个运营商都有自己的功能。这是愚蠢的实现,我会稍后改进它,使诸如_.lower() + '.html'的东西成为可能。问题是,每次我调用一个神奇的方法时,Python似乎都会用新的返回值来替换自己,在这种情况下这是一个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行为如预期?

+5

在shell内部,'_'用于存储最后的评估结果.....不要对你的'_'做任何事情 - 只要在IDLE /交互式提示符中放置'2 + 2',然后键入'_' - 你会得到4 –

+0

亲爱的主 - '我会再次测试并编辑我的测试 –

+5

在交互式shell之外,它通常被用作ugettext和本地化的shorcut名字......我认为最简单的事情是避免使用该名称开始:) –

回答

5

_被交互式解释器用来存储最后的评估结果。每当你尝试做某件事时,你都会无意中将你的_覆盖。另请注意,_经常被用作uggettext等的快捷方式。最简单的办法是避免_现在...

感谢thefourtheye您指出从其中列明了Python documentation的相关章节:

特殊标识符_在交互式解释器用于存储结果最后的评估;它存储在__builtin__模块中。当不处于交互模式时,_没有特殊含义,没有定义。请参见导入语句部分。

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