了解Python中的函数参数

扎克马克

我试图了解以下有关处理函数及其参数的信息:

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)

输出:

call_no = 0
  my_arg = My Value 1
call_no = 1 # I'd like to see 'My Value 2' here
call_no = 2 # I'd like to see 'Default Value' here

显然,人们可以按照上面显示的任何一种方式自由调用函数,这使我感到奇怪:为什么my_arg仍然不去kwargs是否没有统一的方法来按名称(而不是按位置)访问参数,而这并不取决于调用函数的方式?

请注意:

  1. 我对此不感兴趣print_my_args(func, call_no, my_arg),因为我正在谈论的情况是我func事先不知道的签名,但是我想知道是否存在一个特定的参数(按名称)。

  2. 显然,这与装饰器有关,但是我以更简单的方式编写了示例(或者我希望如此)。

编辑

非常感谢您提供有关inspect.signature的答案。使用它,我的新版本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' ] ) )
塔德格·麦当劳·詹森(Tadhg McDonald-Jensen)

是否没有统一的方法来按名称(而不是按位置)访问参数,而这并不取决于调用函数的方式?

是的,请inspect通过以下命令signature

>>> import inspect
>>> sig = inspect.signature(foo)
>>> print(sig)
(call_no, my_arg='Default Value')
>>> args = sig.bind(1, "my_value")
>>> args.arguments["my_arg"]
'my_value'

请注意,尝试将签名绑定到无效调用将引发类似/相同的TypeError,与使用无效参数调用函数时会引发类似的TypeError。args.arguments除非您调用否则使用默认值的参数也不会出现args.apply_defaults()

另请注意,仅关键字参数将在args.kwargs字典中而不是args.arguments

import inspect

def bar(a,*, b=None):
    pass

sig = inspect.signature(bar)

binding = sig.bind(1, b=5)

assert "a" in binding.arguments
assert "b" in binding.kwargs

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解.reduce()中的许多函数参数

来自分类Dev

了解.filter()的函数参数

来自分类Dev

了解python中的嵌套Lambda函数行为

来自分类Dev

了解python中的lambda的sort函数

来自分类Dev

在python Hetland的书示例中了解区间函数及其参数

来自分类Dev

了解匿名函数中的参数(回调示例)

来自分类Dev

了解匿名函数中的参数(回调示例)

来自分类Dev

试图了解Java函数参数

来自分类Dev

了解Prolog中的参数

来自分类Dev

检查Python中函数的参数

来自分类Dev

Python语法:函数参数中的“ for”

来自分类Dev

Python跳过函数中的参数

来自分类Dev

在python函数中传递参数

来自分类Dev

Python - 函数中的空参数

来自分类Dev

Python函数中的多个参数

来自分类Dev

在python中为函数参数发送参数

来自分类Dev

了解Python函数

来自分类Dev

了解Python函数

来自分类Dev

了解JavaScript中的函数

来自分类Dev

Haskell中的函数-了解

来自分类Dev

了解jQuery中的not()函数

来自分类Dev

了解函数中的指针

来自分类Dev

在python中的函数参数内调用函数

来自分类Dev

Javascript:了解未给出参数的函数中参数的含义和行为

来自分类Dev

以函数为参数了解辅助构造函数中的Scala行为

来自分类Dev

Django / Python:了解函数中如何使用超级

来自分类Dev

了解Python中的map函数-索引重新分配

来自分类Dev

了解递归函数中总值的存储位置-Python

来自分类Dev

Django / Python:了解函数中如何使用超级