You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.5中如何获取函数的参数、默认值及类型信息

在Python 3.5中获取函数参数详情的方案

当然可以!在Python 3.5里,标准库的inspect模块就是干这个的完美工具,完全能满足你生成函数详情XML的需求——不管你手里攥着的是函数实例,还是只有函数名字符串,都能轻松抠出参数列表、默认值,甚至推断参数类型。

一、直接用函数实例提取参数信息

inspect.signature()是Python 3.3+就引入的功能,在3.5里已经非常稳定,它能帮你解析函数的完整签名,把所有参数的细节都扒出来。

核心操作步骤:

  1. 用inspect.signature(func)拿到函数的签名对象
  2. 遍历签名的parameters属性(这是个有序字典,键是参数名,值是inspect.Parameter对象)
  3. 从每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:46:00