我正在尝试在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
按预期运行?
答案 0 :(得分:5)
_
来存储最后评估的结果。每当你尝试做某事时,你就会无意中覆盖了_
。另请注意,_
经常被用作uggettext
和类似的快捷方式。最简单的解决方案是暂时避免_
...
感谢thefourtheye指出Python documentation中指出的相关部分:
在交互式解释器中使用特殊标识符_来存储上次评估的结果;它存储在
__builtin__
模块中。如果不处于交互模式,_
没有特殊含义,也没有定义。请参阅import语句。注意名称
_
通常与国际化一起使用;有关此约定的更多信息,请参阅gettext
模块的文档。