python装饰器从装饰函数中获取参数

Ale*_*chi -1 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]
Run Code Online (Sandbox Code Playgroud)

我知道调用bar('test1)基本上是调用foo(bar('test1')),但当我尝试在其他函数之前打印some_stringfoo,我得到some_string is not defined:

def foo(bar):
    print(some_string)
    def test(some_string):
        return 'Decorator test: '+bar(some_string)
    return test
Run Code Online (Sandbox Code Playgroud)
  1. 如何test知道some_stringfoo没有?
  2. 为什么我必须返回test装饰工作?直接返回Decorator test: '+bar(some_string)不起作用,因为some_string没有定义.

Mar*_*ers 6

我明白打电话bar('test1)基本上是打电话foo(bar('test1'))

不,不是,你的理解是不正确的.它基本上是在呼唤

foo(bar)('test')
Run Code Online (Sandbox Code Playgroud)

@foo装饰语法告诉Python来调用foo()传递由命名的函数对象bar(和结果分配回名bar).

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

def test(some_string):
    # ...
return test
Run Code Online (Sandbox Code Playgroud)

所以结果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
Run Code Online (Sandbox Code Playgroud)