Python 3.5中如何获取函数的参数、默认值及类型信息
在Python 3.5中获取函数参数详情的方案
当然可以!在Python 3.5里,标准库的inspect模块就是干这个的完美工具,完全能满足你生成函数详情XML的需求——不管你手里攥着的是函数实例,还是只有函数名字符串,都能轻松抠出参数列表、默认值,甚至推断参数类型。
一、直接用函数实例提取参数信息
inspect.signature()是Python 3.3+就引入的功能,在3.5里已经非常稳定,它能帮你解析函数的完整签名,把所有参数的细节都扒出来。
核心操作步骤:
- 用
inspect.signature(func)拿到函数的签名对象 - 遍历签名的
parameters属性(这是个有序字典,键是参数名,值是inspect.Parameter对象) - 从每个
Parameter对象里挖你要的信息:- 参数名:直接取
parameter.name - 默认值:
parameter.default,如果参数没设默认值,会返回inspect.Parameter.empty,这时候你可以标记成“无默认值” - 参数类型:优先看
parameter.annotation(3.5已经支持PEP 484的类型注解啦,比如def func(a: int)这种);如果没注解但有默认值,就用type(parameter.default)推断;要是默认值是None,那只能标记成“未知类型”或者结合文档字符串再判断 - 参数类别:
parameter.kind,比如POSITIONAL_OR_KEYWORD是普通的位置/关键字参数,VAR_POSITIONAL是*args这种可变位置参数,VAR_KEYWORD是**kwargs可变关键字参数
- 参数名:直接取
举个实际例子:
import inspect # 随便定义个带各种参数的函数来测试 def calculate_total(price: float, quantity: int = 1, discount: float = 0.0, *extra_fees, **options): return price * quantity * (1 - discount) # 获取函数签名 sig = inspect.signature(calculate_total) # 逐个解析参数 for name, param in sig.parameters.items(): # 处理默认值 if param.default is inspect.Parameter.empty: default_val = "无默认值" else: default_val = repr(param.default) # 处理类型 if param.annotation is not inspect.Parameter.empty: param_type = str(param.annotation) elif param.default is not inspect.Parameter.empty and param.default is not None: param_type = str(type(param.default).__name__) else: param_type = "未知类型" print(f"参数名:{name}") print(f" 类型:{param_type}") print(f" 默认值:{default_val}") print(f" 参数类别:{param.kind.name}\n")
二、通过函数名字符串拿到函数对象
如果你手里只有函数名的字符串,得先把它转成函数实例才能解析:
- 如果函数在当前模块:直接用
globals()[func_name]就能拿到函数 - 如果函数在其他模块:先用
importlib.import_module导入目标模块,再用getattr(module, func_name)捞函数
示例代码:
import importlib import inspect # 假设函数在my_module模块里,函数名叫calculate_total module_name = "my_module" func_name = "calculate_total" # 导入模块并获取函数 module = importlib.import_module(module_name) target_func = getattr(module, func_name) # 接下来就可以用上面的方法解析target_func的参数了 sig = inspect.signature(target_func) # ... 后续处理和之前完全一样
三、适配XML生成的小建议
为了让你的XML生成器能兼容后续函数的修改、新增或删除,我给你提俩小思路:
- 把参数提取逻辑封装成一个独立函数,比如
get_function_details(func_or_name),输入可以是函数实例或名字字符串,返回包含所有参数详情的字典或列表,这样生成XML的时候直接调用就行 - 遍历项目里的函数时,尽量用
inspect.getmembers自动扫描模块里的函数对象,别硬编码函数名——这样新增或删除函数时,生成器能自动感知,不用改核心代码 - 对于
*args和**kwargs这类可变参数,在XML里单独标记,比如<var_positional_args>args</var_positional_args>,让XML结构更清晰
这样一来,不管后续函数怎么改,只要你的提取逻辑基于inspect模块,就能自动适配,生成正确的XML内容。
内容的提问来源于stack exchange,提问作者superpg
相关产品推荐
相关产品推荐

