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

标签 python metaprogramming

我有以下通用调试器:

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/

相关文章:

python - 未在不同类中使用 Signals and slots PyQt5 定义 Url

python - Conv3d 与 Conv2d 之间的区别

python - 我该如何处理这个回溯名称错误?这是我的第一个脚本

c++ - default_delete 的部分特化

c++ - std::is_same 和 std::get 在一起

c# - c# 中是否有一些用于高级元编程的行业 "standard"?

functional-programming - 如何在对象的多个方法上使用 functools.partial 并无序卡住参数?

Python:使用拉丁字符对 URL 进行 URL 编码

Python3.2 Str.format值重复

Ruby 全局变量