是否有内置方法来模拟将值分配给参数? [复制]

Posted

技术标签:

【中文标题】是否有内置方法来模拟将值分配给参数? [复制]【英文标题】:Is there a built-in way to simulate assignment of values to arguments? [duplicate] 【发布时间】:2020-05-06 23:25:11 【问题描述】:

我有一个装饰器,用于抑制和记录函数中的异常。代码是这样的:

def log_exceptions(func):
    def wrapper(*args, **kwargs):
        try:
            ret = func(*args, **kwargs)
        except Exception as e:
            print(e)
            print(args, kwargs)  # also log what arguments caused the exception
        return ret
    return wrapper

这里的一个问题是,很难手动将打印的参数值与函数的参数名称匹配,因为位置参数也可以进入kwargs,并且可能有argskwargs 参数在内部函数中也是如此。因此,将包装器中的 argskwargs 值与内部函数中的参数名称相匹配会很有用。

那么我的问题是,有没有内置的方法来进行这种匹配?如果不是,那么实现它的优雅方式是什么?

【问题讨论】:

另见this one @Pynchia:这是解决方案的一部分,但它没有显示如何执行匹配。 (诚​​然,这是困难的部分——实现bind 比实现signature 更简单,所需知识更少——但重新实现bind 仍然是很多毫无意义的工作。) 【参考方案1】:

如果可以确定签名,那么inspect.signature(func).bind(*args, **kwargs) 就可以完成这项工作。

inspect.signature(func)(小写 s)尝试计算一个表示可调用签名的 Signature 对象(大写 S),结果 Signaturebind 方法将签名与提供的参数匹配,返回 @987654323 @ 目的。结果对象的arguments 属性是参数名称到值的有序映射,不包括依赖默认值的参数。

这里有一个例子说明你可以如何使用它:

import inspect

try:
    sig = inspect.signature(func)
except (TypeError, ValueError):
    print('Could not determine function signature.')
else:
    try:
        bound = sig.bind(*args, **kwargs)
    except TypeError:
        print('Could not bind arguments to function signature.')
        print('Signature:', sig)
        print('Positional arguments:', args)
        print('Keyword arguments:', kwargs)
    else:
        # You can use bound.apply_defaults() to include defaults
        print('Bound arguments (defaults not included):')
        for name, value in bound.parameters:
            print(': !r'.format(name, value))

【讨论】:

以上是关于是否有内置方法来模拟将值分配给参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

分配给位置参数

分配给位置参数

是否有一种内置方法可以在没有任何查询参数的情况下获取当前 URL?

是否有内置方法来比较集合?

C - 将值分配给结构数组的分段错误

Redux 是不是有内置的方法来撤消操作?