关于python反射中函数动态赋参问题
时间:2019-07-20
本文章向大家介绍关于python反射中函数动态赋参问题,主要包括关于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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [HTTP趣谈]支持跨域及相关cookie设置
- pytest封神之路第三步 精通fixture
- 前端网络高级篇(六)网站性能优化
- 使用Webrtc和React Js在网络上共享跨平台的点对点文件
- JSBridge小科普
- Greenplum编译安装
- 宏任务和微任务到底是什么?
- React中的setState是异步的吗?
- java安全编码指南之:堆污染Heap pollution
- ECMAScript6基础学习教程(五)对象
- React入门系列(三)创建组件
- prometheus学习笔记(2)-利用java client写入数据
- Vue入门系列(一)Vue技术栈
- Openwrt智能路由系统开发--内容总结
- 干爆红队-爆破CS Teamserver 密码