Python3如何根据函数名动态调用函数
作者:开发者超屎
这篇文章主要介绍了Python3如何根据函数名动态调用函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
根据函数名动态调用函数
最近项目需求,需要动态调用函数,这里整理一下思路。
很多时候,我们需要根据外面传进来的字符串取动态调用函数,并获取返回值。
例如单项目检查等,检查的类型可以事先在定义文件中配置好,这样后期维护的时候,如果需要修改,直接修改配置文件就好了,而不必修改代码。
要动态调用,如果是在同一个模块(.py)中,直接使用eval(function_name)(param(如果有的话))。
如果是在一个模块中动态调用另一个模块中的函数,则需要使用 importlib 包。这里主要介绍 eval 用法, importlib 包的具体用法后面再做追加。
事先定义多个方法
# 检查文本类型是否为字符串 # @param text 文本 # @return True:是,False:不是 def __string(text): return True if isinstance(text, str) else False # 检查文本类型是否为浮点型 # @param text 文本 # @return True:是,False:不是 def __float(text): if __string(text): try: return True if float("{0}".format(text)) else False except Exception: return False else: return True if isinstance(text, float) else False # 检查文本类型是否为浮点型 # @param text 文本 # @return True:是,False:不是 def __int(text): if __string(text): try: return True if float("{0}".format(text)) else False except Exception: return False else: return True if isinstance(text, float) else False # 检查文本类型是否为数字型 # @param text 文本 # @return True:是,False:不是 def __number(text): return True if re.search("[^0-9]", text) == None else False
然后再写一个函数来可以动态的调用这些函数(根据函数名字符串):
# 项目check # @param tag 标签名 # @param text 文本 # @return True:OK, False:NG def item_check(func_name, text): if type and text: try: # 调用导入模块中的函数,并传参 return eval("__{0}".format(func_name))(text) except Exception: return False else: return False
现在,我们来测试一下这样的方法是否正确可用:
result = item_check("number", "123456") print("{0}是否为{1}:{2}".format("123456", "number", result))
运行程序,控制台输出:
123456是否为number:True
Process finished with exit code 0
说明我们的动态调用是OK的。
下面是完整的代码
文件:item_check.py
import re # 检查文本类型是否为字符串 # @param text 文本 # @return True:是,False:不是 def __string(text): return True if isinstance(text, str) else False # 检查文本类型是否为浮点型 # @param text 文本 # @return True:是,False:不是 def __float(text): if __string(text): try: return True if float("{0}".format(text)) else False except Exception: return False else: return True if isinstance(text, float) else False # 检查文本类型是否为浮点型 # @param text 文本 # @return True:是,False:不是 def __int(text): if __string(text): try: return True if float("{0}".format(text)) else False except Exception: return False else: return True if isinstance(text, float) else False # 检查文本类型是否为数字型 # @param text 文本 # @return True:是,False:不是 def __number(text): return True if re.search("[^0-9]", text) == None else False # 项目check # @param tag 标签名 # @param text 文本 # @return True:OK, False:NG def item_check(func_name, text): if type and text: try: # 调用导入模块中的函数,并传参 return eval("__{0}".format(func_name))(text) except Exception: return False else: return False if __name__ == "__main__": result = item_check("number", "123456") print("{0}是否为{1}:{2}".format("123456", "number", result))
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。