我试图了解以下关于函数及其参数的处理:def print_my_arg(func, *args, **kwargs):
func(*args, **kwargs)
if 'my_arg' in kwargs:
print(' my_arg = {}'.format(kwargs['my_arg']))
def foo(call_no, my_arg='Default Value'):
print('call_no = {}'.format(call_no) )
print_my_arg(foo, 0, my_arg='My Value 1')
print_my_arg(foo, 1, 'My Value 2')
print_my_arg(foo, 2)
输出:
^{pr2}$
显然,人们可以自由地以上面所示的任何一种方式调用函数,这让我想知道:为什么my_arg不转到{}?难道没有一种统一的方法可以按名称(而不是位置)访问参数吗?这与调用函数的方式无关?在
请注意:我对print_my_args(func, call_no, my_arg)不感兴趣,因为我说的是这样的情况:我事先不知道{}的签名,但我想知道是否存在某个特定的参数(按名称)。
显然这与decorators有关,但是我用一种更简单的方式编写了示例(或者我希望如此)。
编辑
非常感谢您关于检验人签字. 使用它,我的新版本print_my_arg()是:from inspect import signature
def print_my_arg ( func, *args, **kwargs ):
func ( *args, **kwargs )
sig = signature ( func )
if 'my_arg' not in sig.parameters: return
binding = sig.bind ( *args, **kwargs )
binding.apply_defaults ()
print ( " my_arg = {}".format ( binding.arguments [ 'my_arg' ] ) )