gpt4 book ai didi

python - 从函数声明中收集参数名称

转载 作者:行者123 更新时间:2023-11-28 20:15:39 24 4
gpt4 key购买 nike

我有以下通用调试器:

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 具有语义意义,可以用作 startend...它们不是 *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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com