代码之家  ›  专栏  ›  技术社区  ›  Rob Truxal

内部装饰函数如何查看修饰函数参数?[复制]

  •  0
  • Rob Truxal  · 技术社区  · 6 年前

    我正试图攻克python的最后一个基本特性:decorators。我没有像处理列表比较那样摸索它,而且我不理解decorator声明中的内部函数是如何工作的。

    这是我的意思的一个例子。给出这个chunk-o-code:

    def outer(func):
        def inner(*args, **kwargs):
            print('Hi my name is ')
            return func(*args, **kwargs)
        return inner
    
    @outer
    def decorated(name):
        print(name)
    
    
    decorated('Bob')
    

    Hi my name is
    Bob
    

    但我不明白的是 inner *args **kwargs decorated()

    @outer
    def decorated(name):
        print(name)
    decorated("Bob")
    

    相当于 outer(decorated("Bob")) . 如果是这样,怎么会呢 inner() name 争论?撇开语法问题不谈,我希望inner的声明看起来像 def inner(func.args, func.kwargs):

    这是怎么回事?我误解了什么?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Jonas Schäfer    6 年前

    我的理解是

    @outter
    def decorated(name):
        print(name)
    decorated("Bob")
    

    相当于 outter(decorated("Bob")) .

    那是错误的。相当于 outter(decorated)("Bob") decorated 替换为的返回值 outer(decorated) (即 inner ). 当你打电话的时候 装饰 ,你真的在打电话 内部的

    您可以交互检查:

    >>> def outter(func):
    ...     def inner(*args, **kwargs):
    ...         print('Hi my name is ')
    ...         return func(*args, **kwargs)
    ...     return inner
    ...
    >>> @outter
    ... def decorated(name):
    ...     print(name)
    ...
    >>> decorated
    <function outter.<locals>.inner at 0x7f5aec3461e0>
    
    推荐文章