Python 获得函数参数

在编写 Python 代码时,经常需要获取函数的参数信息。这些参数信息可以帮助我们理解函数的用途,还可以在一些特殊情况下进行参数处理。本文将介绍在 Python 中如何获得函数的参数信息,并提供相应的代码示例。

使用 inspect 模块

Python 提供了 inspect 模块,该模块包含一些用于获取对象信息的函数。其中,signature 函数可以用于获取函数的参数信息。我们可以通过传入函数对象来获得其参数信息。

import inspect

def foo(a, b, c=10, *args, **kwargs):
    pass

sig = inspect.signature(foo)
params = sig.parameters

for name, param in params.items():
    print(name, param.default, param.kind)

在以上示例中,我们定义了一个名为 foo 的函数,它包含了一个必选参数 a,一个默认参数 c,一个可变位置参数 args 和一个可变关键字参数 kwargs。我们使用 inspect.signature 函数获得了 foo 的参数信息,并通过遍历 parameters 字典打印出了参数名、默认值和参数类型。

运行以上代码,输出结果如下:

a <class 'inspect._empty'> POSITIONAL_OR_KEYWORD
b <class 'inspect._empty'> POSITIONAL_OR_KEYWORD
c 10 POSITIONAL_OR_KEYWORD
args <class 'inspect._empty'> VAR_POSITIONAL
kwargs <class 'inspect._empty'> VAR_KEYWORD

可以看到,对于必选参数和默认参数,param.default 的值为 inspect._empty,而对于可变位置参数和可变关键字参数,param.kind 分别为 VAR_POSITIONALVAR_KEYWORD

使用 __annotations__ 属性

在 Python 3.x 版本中,我们可以在函数定义时通过 : 来指定参数的类型。这些类型信息可以通过函数的 __annotations__ 属性来获取。

def bar(a: int, b: str) -> bool:
    pass

annotations = bar.__annotations__

for name, annotation in annotations.items():
    print(name, annotation)

在以上示例中,我们定义了一个名为 bar 的函数,并使用 : 来指定了参数 a 的类型为 int,参数 b 的类型为 str,返回值的类型为 bool。我们通过访问 __annotations__ 属性获得了函数的类型注解,并通过遍历字典打印出了参数名和其对应的类型。

运行以上代码,输出结果如下:

a <class 'int'>
b <class 'str'>
return <class 'bool'>

可以看到,通过 __annotations__ 属性,我们可以方便地获取参数的类型信息。

使用 inspect 模块获取更多信息

除了参数信息之外,inspect 模块还提供了其他一些函数用于获取更多的函数信息。以下是一些常用的函数:

  • inspect.getargspec(func): 获取函数的参数名、默认值和变长参数的名字。该函数已在 Python 3.5 中废弃,推荐使用 inspect.signature
  • inspect.getfullargspec(func): 获取函数的参数名、默认值、变长参数的名字和关键字参数的名字。
  • inspect.getcallargs(func, *args, **kwargs): 获取函数调用时的参数绑定。

这些函数可以根据需要选择使用,以获得函数的更多信息。

总结

在本文中,我们介绍了在 Python 中如何获得函数的参数信息。我们使用了 inspect 模块提供的 signature 函数和 __annotations__ 属性来获取参数的信息和类型注解。此外,我们还了解了一些其他的函数,可用于获取更多的函数信息。获得函数参数信息能够帮助我们更好地理解函数的用途,并在一些特殊情况下进行参数处理。

希望通过本文的介绍,你能够更好地掌握在 Python 中获得函数参数的方法,并在实际开发中灵活运用。