相关疑难解决方法(0)

如何以与inspect.signature配合使用的方式包装python函数?

前面一些没有争议的背景实验:

import inspect

def func(foo, bar):
  pass

print(inspect.signature(func))  # Prints "(foo, bar)" like you'd expect

def decorator(fn):
  def _wrapper(baz, *args, *kwargs):
    fn(*args, **kwargs)

  return _wrapper

wrapped = decorator(func)
print(inspect.signature(wrapped))  # Prints "(baz, *args, **kwargs)" which is totally understandable
Run Code Online (Sandbox Code Playgroud)

问题

如何实现我的装饰器以便print(inspect.signature(wrapped))吐出“(baz, foo, bar)”?我可以通过添加传入的_wrapper参数然后粘贴到列表来动态构建吗?fnbaz

答案不是

def decorator(fn):
  @functools.wraps(fn)
  def _wrapper(baz, *args, *kwargs):
    fn(*args, **kwargs)

  return _wrapper
Run Code Online (Sandbox Code Playgroud)

再次给出“(foo, bar)”——这是完全错误的。调用wrapped(foo=1, bar=2)是一个类型错误 - “缺少 1 个必需的位置参数:'baz'”

我认为没有必要如此迂腐,但是

def decorator(fn):
  def _wrapper(baz, foo, bar):
    fn(foo=foo, bar=bar)

  return _wrapper …
Run Code Online (Sandbox Code Playgroud)

python python-decorators

7
推荐指数
1
解决办法
501
查看次数

标签 统计

python ×1

python-decorators ×1