关于python反射中函数动态赋参问题

2019年7月12日

python反射机制中参数问题小解
例子
import sys
import inspect
def fun(name,age):
    print(name,age)

if __name__ == '__main__':
    fun = getattr(sys.modules[__name__],'fun')
    fun()  #程序报错

错误:==TypeError: fun() missing 2 required positional arguments: 'name' and 'age'==

fun()函数缺少了两个所需位置参数:name和age。

即:如果同时存在多个无参和有参的函数,那么如果继续使用寻常的反射机制则无法完美动态的解决这个问题。
经过查询,暂时找到两种解决方案:
  • 第一种:可以通过fun._code_.co_argcount来获取反射函数的参数个数。
parameter_count = fun.__code__.co_argcount #统计函数所需的参数个数
v_list = []   #创建一个空列表来存储参数值
for i in range(0, parameter_count): #遍历参数个数,赋值
    parameter = input('请输入第{}个参数:'.format(i+1))
    v_list.append(parameter)  #讲值append进list中
    fun(*v_list)#通过list拆包将参数传给带参函数
  • 第二种:较第一种方法更加直观,简便。通过导入inspect包中的getfullargspec(fun)方法,返回一个FullArgSpec对象,对象中的args属性包含了fun函数的所有参数名称(r.args)和默认参数值(r.defaults)。
v_list = []
fun = getattr(sys.modules[__name__],'fun')
r = inspect.getfullargspec(fun)  #获取FullArgSpec对象
for i in r.args:
    res = input('输入{}'.format(i))
    v_list.append(res)
fun(*v_list)

通过以上两种方式可以暂时解决在python反射机制中由于参数个数不同而导致的动态匹配问题。

转载于:https://www.cnblogs.com/why72/p/11218142.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值