Python - 在命名函数之后调用包装函数

时间:2014-01-21 21:31:51

标签: python namespaces wrapper

老实说,我不知道这是好,坏,中立等等。

def foo():
    return "foo called"

def bar():
    return "BAR CALLED"

def wrap(func):
    def _(*args, **kwargs):
        try:
            func.counter += 1
        except:
            func.counter = 0
        print "The count is %d" % func.counter
        return func(*args, **kwargs)
    return _

>>> foo = wrap(foo)
>>> bar = wrap(bar)
>>> foo()
'The count is 0'
'foo called'
>>> foo()
'The count is 1'
'foo called'
>>> bar()
'The count is 0'
'BAR CALLED'

到目前为止,这么好 - 功能只是包装,没什么大不了的。以下是我不知道是否考虑某项功能的问题。

>>> foo
<function _ at 0x100499ed8>
>>> _()
The count is 2
'foo called'
>>> bar
<function _ at 0x10049f320>
>>> _()
The count is 1
'BAR CALLED'
>>> 

也许我对这里的幕后花絮知之甚少,但是Python在内存中有两个名为_的包装函数,用户只需键入函数名即可在它们之间“切换”它包裹着。

这是一个功能,如果是,它的主要应用是什么?或者如果不是这样,最好不要忘记这一点,因为试图强调这种行为只是一个坏主意吗?我的熟练的猜测是,这只是可行的,因为Python中没有真正的闭包(可能将它放在We're all adults here之下,我不应该尝试实际做到这一点),但这是一个没有受过教育的猜测。

1 个答案:

答案 0 :(得分:2)

这是Python解释器的快捷方式。评估的最后一个表达式的结果被分配给_,以便您可以在后续操作中使用它。

像:

>>> 5 + 7
12
>>> _ * 2
24
>>> _ + 3
27

请注意,这仅适用于交互式 shell,而不适用于脚本,并且仅在您尚未定义_时才有效。