Python 3.6 inspect.signature() не показывает аргументы

У меня есть функция:

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))

я получил

(*аргументы, **кваргс)

Почему «inspect.signature» не видит аргументы функции?

РЕШЕНО: ПРОБЛЕМА БЫЛА ИЗ-ЗА ДЕКОРАТОРА


person dimkor    schedule 09.07.2018    source источник
comment
У меня работает нормально.   -  person Cory Kramer    schedule 09.07.2018
comment
У меня установлен Python 3.6, и он работает нормально: напечатанная подпись (start=1, quantity=100, days_left=7, min_app_version=None)   -  person Andrej Kesely    schedule 09.07.2018
comment
Есть ли у report какие-либо аннотации или какие-либо динамические изменения? Что показывает inspect.getfullargspec(report)?   -  person FHTMitchell    schedule 09.07.2018
comment
@FHTMitchell показывает: FullArgSpec(args=[], varargs='args', varkw='kwargs', defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})   -  person dimkor    schedule 09.07.2018
comment
Отлично, рад, что вы нашли решение. Вы должны опубликовать ответ на свой вопрос (и показать код с помощью декоратора).   -  person FHTMitchell    schedule 09.07.2018


Ответы (2)


Даже лучше, чем удалять декоратор, вы можете указать декоратору, чтобы оболочка функции выглядела как упакованная функция для инструментов проверки, используя 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)
person Patrick Haugh    schedule 09.07.2018

Если кто-то когда-нибудь застрянет с этой ошибкой, просто удалите декоратор функции.

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

Вы также можете помочь себе: Как удалить декораторы из функции на Питоне

person dimkor    schedule 09.07.2018