【问题标题】:Python 3.6 inspect.signature() doesn't show argumentsPython 3.6 inspect.signature() 不显示参数
【发布时间】:2018-12-17 08:11:17
【问题描述】:

我有一个函数:

def report(start=1, quantity=100, days_left=7, min_app_version=None):

我想获取参数名称和默认值,例如

{'start':1, 'quantity':100, 'days_left':7, 'min_app_version':None}

(或至少两个列表)来自此函数之外

当我这样做时

import inspect
print(inspect.signature(report))

我明白了

(*args, **kwargs)

为什么 'inspect.signature' 看不到函数参数?

已解决:问题出在装饰器上

【问题讨论】:

  • 对我来说似乎是work fine
  • 我安装了 Python 3.6 并且工作正常:打印的签名是 (start=1, quantity=100, days_left=7, min_app_version=None)
  • report 是否有任何注释或以任何方式动态修改? inspect.getfullargspec(report) 显示什么?
  • @FHTMitchell 它显示:FullArgSpec(args=[], varargs='args', varkw='kwargs', defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
  • 太好了,很高兴您找到了解决方案。您应该发布自己问题的答案(并使用装饰器显示代码)。

标签: python python-3.x inspect method-signature


【解决方案1】:

甚至比移除装饰器更好,你可以告诉装饰器使函数包装器看起来像使用functools.wraps检查工具的包装函数

代替

def decorator(f):
    def wrapper(*args, **kwargs):
        print("Wrapped")
        return f(*args, **kwargs)
    return wrapper

@decorator
def report(start=1, quantity=100, days_left=7, min_app_version=None):
    pass

print(inspect.signature(report))
# (*args, **kwargs)

你可以的

from functools import wraps

def decorator(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print("Wrapped")
        return f(*args, **kwargs)
    return wrapper

@decorator
def report(start=1, quantity=100, days_left=7, min_app_version=None):
    pass

print(inspect.signature(report))
# (start=1, quantity=100, days_left=7, min_app_version=None)

【讨论】:

    【解决方案2】:

    如果有人遇到此错误,只需删除函数装饰器即可。

    @time_count
    def report(start=1, quantity=100, days_left=7, min_app_version=None):
    

    您还可以帮助自己: How to strip decorators from a function in Python

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多