【问题标题】:Python decorator from chained calls来自链式调用的 Python 装饰器
【发布时间】:2019-06-03 20:16:44
【问题描述】:

我正在尝试从一系列调用中创建一个装饰器。语法似乎不支持。

from functools import wraps


class Bar:
    def wrapper(self):
        def _outer(fun):
            @wraps(fun)
            def _f(*a, **kw):
                print('I am in decorator')
                return fun(*a, **kw)
            return _f
        return _outer


def foo():
    return Bar()


# @foo().wrapper()  # Invalid syntax
# def f():
#     pass


# @(foo().wrapper())  # Invalid syntax
# def f():
#     pass


def f():
    pass


f = foo().wrapper()(f)
f()

我错过了什么吗?由于某些原因,这样的东西在我的项目中非常有用。

谢谢

【问题讨论】:

  • 是的,不支持该语法,它被设计得很有限。
  • 你总是可以做到f = foo().wrapper(f)
  • 感谢您的帮助。确实,表达的潜力完全消失了……真可惜。

标签: python decorator python-decorators


【解决方案1】:

你可以这样做:

wrapper = foo().wrapper()

@wrapper
def foo():
  pass

【讨论】:

  • 请注意,根据grammar,只有foo 后面的括号有问题。 @foo.wrapper() 很好。
  • 谢谢,不幸的是我必须调用一连串的东西。
  • 使用property 可能会解决您的问题。他们添加了一个函数调用作为属性查找。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
相关资源
最近更新 更多