有没有内置的方法来模拟给参数赋值?
Is there a built-in way to simulate assignment of values to arguments?
我有一个装饰器,用于抑制和记录函数内的异常。代码是这样的:
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
,并且可能有 args
和 kwargs
内部函数中的参数。因此,将包装器中的 args
和 kwargs
值与内部函数中的参数名称相匹配会很有用。
那么我的问题是,是否有内置的方法来进行这种匹配?如果没有,什么是优雅的实现方式?
如果可以确定签名,那么 inspect.signature(func).bind(*args, **kwargs)
就可以了。
inspect.signature(func)
(lowercase s) attempts to compute a Signature
object (capital S) representing a callable's signature, and the resulting Signature
's bind
method matches the signature against provided arguments, returning a BoundArguments
对象。结果对象的 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))
我有一个装饰器,用于抑制和记录函数内的异常。代码是这样的:
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
,并且可能有 args
和 kwargs
内部函数中的参数。因此,将包装器中的 args
和 kwargs
值与内部函数中的参数名称相匹配会很有用。
那么我的问题是,是否有内置的方法来进行这种匹配?如果没有,什么是优雅的实现方式?
如果可以确定签名,那么 inspect.signature(func).bind(*args, **kwargs)
就可以了。
inspect.signature(func)
(lowercase s) attempts to compute a Signature
object (capital S) representing a callable's signature, and the resulting Signature
's bind
method matches the signature against provided arguments, returning a BoundArguments
对象。结果对象的 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))