今天给大家分享一个Python开发实用小干货:如何将Python公共函数设置全局可用。
在日常Python开发过程中,需要根据不同的功能用途,将代码划分在不同的模块下即不同.py文件中。例如项目中有一个名称为common.py公共模块,专门用于存放项目公共函数,假设在common.py模块中,有一个用于统计函数运行的装饰器函数,示例代码如下:
"""
定义一个计算函数运行时间的装饰器(计算时间使用time模块实现)
"""
import time
def wrapper(func):
def count_time(*args,**kwargs):
start_time=time.time()
print(start_time)
func(*args,**kwargs)
end_time=time.time()
print(end_time)
print('函数运行的时间为:{:.5f}'.format(end_time-start_time))
return count_time
该统计函数运行时间的功能,其他模块(例如有:web_app.py、h5_app.py)都会调用到,正常情况下,如果要实现这种模块相互调用,使用from xxx import xxx即可。
web_app.py调用common.py中的函数,常规方法:
# coding=utf-8
import sys
import time
from common import wrapper
@wrapper
def web_app_funa():
print('我是{},准备开始计时'.format(sys._getframe().f_code.co_name))
time.sleep(2)
print('我是{},计时结束'.format(sys._getframe().f_code.co_name))
假设项目启动文件为main.py,直接调用main.py运行项目,示例代码如下:
from web_app import web_app_funa
web_app_funa()
运行结果如下:
这种情况虽然可以达到目的,但如果项目中有非常多的模块都需要调用common.py中的公共函数,意味着所有的模块中都要重复导入类似代码:
from common import wrapper
from common import xxx
这种写法,工作量存在重复,且效率低下,今天就给大家分享一个相对更为高级的用法,可以让我们调用Python自定义模块时,特别是一些公共模块,可以像使用Python中的内置函数一样,不用导入,而是直接使用!
讲之前,大家可以先思考一个问题?大家是否有想过,为什么平时我们在使用print时,可以直接使用,而不用导入,是因为Print这类型函数被称之为Python的内置函数,那是否我们可以让我们自定义的Python函数也变成“内置函数”呢?答案是可以的。
builtins是Python的内建模块,所谓内建模块就是你在使用时不需要import,在Python启 动后,在没有执行程序员编写的任何代码前,Python会加载内建模块中的函数到内存中。除了print,常见的还有abs,str,type等。
具体怎么操作呢?直接贴代码:
1、main.py(项目主入口)
import builtins
from common import wrapper
setattr(builtins, 'wrapper', wrapper)
from web_app import web_app_funa
web_app_funa()
2、web_app.py(项目模块文件)
# coding=utf-8
import sys
import time
@wrapper
def web_app_funa():
print('我是{},准备开始计时'.format(sys._getframe().f_code.co_name))
time.sleep(2)
print('我是{},计时结束'.format(sys._getframe().f_code.co_name))
运行结果如下:
可以看到在web_app.py文件中,我们使用@wrapper装饰器函数时,并没有提前导入,但仍然可以正常使用。
答案就在main.py中的这三句代码中
import builtins
from common import wrapper
setattr(builtins, 'wrapper', wrapper)
我们只需要在运行项目文件(入口)中,导入我们需要的公共模块,然后使用setattr把它设置成builtins内置模块中的一个属性即可。其中第二个参数是全局调用的名称,可以自定义修改,但请注意不要和Python本身的内置函数名冲突即可,第三个参数是你需要注册的工具函数。
完成这几步后,你就可以在任何py文件里直接通过注册的全局名称调用公共模块中的函数了,就跟使用print一样,是不是很酸爽!赶紧收藏起来,试试吧!
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!