python装饰器从装饰函数

时间:2017-08-12 19:02:27

标签: python decorator python-decorators

我有这段代码:

def foo(bar):
    def test(some_string):
        return 'Decorator test: '+bar(some_string)
    return test


def main():
    print(bar('test1'))


@foo
def bar(some_string):
    return some_string[:3]

我理解调用bar('test1)基本上是调用foo(bar('test1')),但当我尝试在some_string之前打印foo之前,我得到some_string is not defined

def foo(bar):
    print(some_string)
    def test(some_string):
        return 'Decorator test: '+bar(some_string)
    return test
  1. test some_string如何foo了解test
  2. 为什么我必须返回Decorator test: '+bar(some_string)装饰工作?直接返回some_string并不起作用print(c(input$buttonNext,randomNumber,input_radio)) 未定义。

2 个答案:

答案 0 :(得分:5)

  

我了解调用bar('test1)基本上是调用foo(bar('test1'))

不,不是,你的理解是不正确的。它基本上是在呼叫

foo(bar)('test')

@foo装饰器语法告诉Python调用foo()传递bar命名的函数对象(并将结果分配回名称bar)。 / p>

foo()装饰器返回了一个新的函数对象:

def test(some_string):
    # ...
return test

因此foo(bar)的结果是名为test的函数对象(foo()装饰器中的本地名称)。 foo(bar)('test')因此被称为test('test')

如果您想打印传递给test(..)的参数,请在 内执行此操作:

def foo(bar):
    def test(some_string):
        print(some_string)
        return 'Decorator test: '+bar(some_string)
    return test

答案 1 :(得分:1)

  

我了解调用bar('test1)基本上是调用foo(bar('test1'))

不,那是不正确的。

调用bar('test1')等同于

bar = foo(bar)
bar('test1')
  

为什么我必须返回test装饰工作?直接返回Decorator测试:' + bar(some_string)不起作用,因为some_string没有定义。

当你这样做时

@decorator
def func():
    pass

Python将其翻译为

def func():
    pass

func = decorator(func)

如您所见,Python希望decorator返回 new 函数。这就是为什么您必须从test foo返回bar才能正常工作的原因。否则,None被分配到bar

>>> def foo(bar):
    def test(some_string):
        return 'Decorator test: '+bar(some_string)


>>> @foo
def bar(some_string):
    return some_string[:3]

>>> bar()
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    bar()
TypeError: 'NoneType' object is not callable
  

当foo没有?

时,测试如何知道some_string?

只是因为在some_string到达之前未创建testsome_string是[{1}}的参数,因此它仅存在于test的范围内。否则,不存在名称test,因此如果您尝试访问它,则会获得some_string - 包括NameError内部。

如果您想foo print的值,请在some_string内执行此操作:

test
相关问题