【问题标题】:How to create a wrapper function with the same annotations and parameter names as the wrapped one in Python如何创建一个与 Python 中的包装函数具有相同注释和参数名称的包装函数
【发布时间】:2021-08-20 15:33:20
【问题描述】:

说我有一个功能:

def foo(x: Type1, y: Type2):
    do something..

我想要另一个功能,比如说:

def bar(f: Callable, args..):
#do something
#return another function Fizz

我希望返回的函数 (Fizz) 具有如下签名:

def Fizz(x: Type1, y: Type2, ...)
    pass

【问题讨论】:

  • bar 是否真的事先知道foo 的签名,还是必须动态创建Fizz 才能匹配?您对运行时检查 (inspect.signatures) 和/或静态类型分析感兴趣吗?
  • bar 不知道foo 的注解,最好它也不知道它的参数名称并且仍然能够将它们也包含在Fizz 的签名中我只对运行时检查感兴趣

标签: python-3.x python-decorators functools


【解决方案1】:

我发现一个可行的解决方案是:

def foo(x: Type1, y: Type2):
    #do something..

def bar(func: Callable):
  func_signature = signature(func)
  params_it = iter(func_signature.parameters.values())
  x = next(params_it)
  y = next(params_it)
  def fizz(x: x.annotation, y: y.annotation):
      pass
  return fizz

但该函数的局限性在于bar“知道”foo 的参数名称

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2017-08-04
    • 1970-01-01
    • 2021-10-05
    • 2017-07-19
    相关资源
    最近更新 更多