我试图在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
行为如预期?
在shell内部,'_'用于存储最后的评估结果.....不要对你的'_'做任何事情 - 只要在IDLE /交互式提示符中放置'2 + 2',然后键入'_' - 你会得到4 –
亲爱的主 - '我会再次测试并编辑我的测试 –
在交互式shell之外,它通常被用作ugettext和本地化的shorcut名字......我认为最简单的事情是避免使用该名称开始:) –