Python 获取函数参数类型,动态准备输入参数

在写代码的时候想到,如何动态的获取指定函数的参数类型,然后有针对性的准备参数呢?首先一个问题是如何获取到一个python模块里的参数以及它们的名字,这一点在我前端时间已经实现了
https://blog.csdn.net/qq_43199509/article/details/132469111

这里发现两个难点,第一个是如何知道函数的定义部分以及参数类型,第二个问题是构造好参数后如何再输入回去
第一个问题我在知乎一个比较新的文章上看到了解决方法,inspect库可以直接读取函数签名为字典,完美契合我的需求
https://www.zhihu.com/question/20591688/answer/3076660482?utm_id=0

第二个问题,在研究python的参数打包解包机制后,发现调用函数的时候直接用**dict就可以直接以字典的形式将参数传进函数

最终代码

def my_sum(a, b: int, c: str, d={}):
    '''
    this is a test
    '''
    print(a, b, c, d)


import inspect


def prepare_inputs(function, default_input=1):
    """
    读取输入的函数信息,尝试根据参数签名生成尽可能可用的
    的参数列表,default_input是无法通过签名判断参数类型时,
    默认的函数参数
    """
    input_dict = {}
    function_parameters = inspect.signature(function).parameters
    for each_parameter in function_parameters:
        parameter_signature = str(function_parameters[each_parameter])
        # python 3.10才有switch,这里用多个if代替
        if parameter_signature == each_parameter:
            # 没有任何参数标签
            input_dict.update({each_parameter: default_input})
        elif '=' in parameter_signature:
            # 设置了默认参数,这里可以直接返回因为默认参数后必须也跟默认参数
            return input_dict
        elif parameter_signature.startswith('*'):
            # 以*开头的*args这类可变参数,说明正常参数已经结束了
            return input_dict

        elif parameter_signature.endswith('int'):
            # int类型,用1作为输入
            input_dict.update({each_parameter: 1})
        elif parameter_signature.endswith('float'):
            # float类型
            input_dict.update({each_parameter: 1.0})
        elif parameter_signature.endswith('str'):
            # str类型
            input_dict.update({each_parameter: 'a'})
        elif parameter_signature.endswith('list'):
            # list类型
            input_dict.update({each_parameter: [1]})
        elif parameter_signature.startswith('dict'):
            # dict类型
            input_dict.update({each_parameter: {'1': 1}})
        else:
            # 有参数签名但是不是常用类型,用一个object对象来作为参数
            input_dict.update({each_parameter: object()})
    return input_dict




inputs = prepare_inputs(my_sum)
my_sum(**inputs)

你可能感兴趣的:(python)