我有以下通用调试器:
def debugger(method):
def dec(*args, **kwargs):
print("\ndebugging '{name}':\n".format(name=method.__name__))
FOUR_SPACES = " " * 4
EIGHT_SPACES = " " * 8
if args:
print("{four}args:\n".format(four=FOUR_SPACES))
for arg in args:
print("%s%s" % (EIGHT_SPACES, arg))
if kwargs:
for key, value in kwargs.items():
print("{four}{key}:\n{eight}{value}\n".format(
four=FOUR_SPACES,
key=key,
eight=EIGHT_SPACES,
value=value
))
if args or kwargs:
print("\n")
result = method(*args, **kwargs)
return result
return dec
@debugger
def generate_minutes_in_timespan(start, end, cutoff_date=None):
# cutoff_date is just example of kwarg
minutes_delta = (end - start).seconds / 60
datetimes = []
delta_range = range(0, minutes_delta + 1)
return [start + timedelta(minutes=i) for i in delta_range]
调试器会做:
debugging 'generate_minutes_in_timespan':
args:
2017-08-31 17:19:00
2017-09-01 12:05:00
这让我有点高兴,但请注意我错过了真实信息。
我想要的是:
debugging 'generate_minutes_in_timespan':
args:
start = 2017-08-31 17:19:00
end = 2017-09-01 12:05:00
*args:
not allowed
kwargs:
cutoff_date = None
*kwargs:
not allowed
那些 args 具有语义意义,可以用作 start
和 end
...它们不是 *args
。
在 python 标准库中是否有深入的方法我可以阅读此方法 generate_minutes_in_timespan
并提取声明、所需位置参数的名称和顺序,以及任何已声明的 kwargs 的名称(如声明cutoff_date=None
,我想知道 cutoff_date
是作为 kwarg 提供的,还是可选的 **kwargs
...)
我为 {'args': [('start', '给定的值'), ('end', '用户给定的值')], 'star_args': None, 'kwargs' : {'cutoff_date': None}, 'star_kwargs': None}
以获得完整的调试信息。
最佳答案
在装饰器中,使用 inspect
发现 arg 名称的模块:
>>> def generate_minutes_in_timespan(start, end, cutoff_date=None):
... ...
...
>>> inspect.getargspec(generate_minutes_in_timespan)
ArgSpec(args=['start', 'end', 'cutoff_date'], varargs=None, keywords=None, defaults=(None,))
^ ^
|________|_____ here they are...
将传递的参数与实际参数名称进行匹配留作 OP 的练习。
关于python - 从函数声明中收集参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46005141/