前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实用干货:99%的人都不知道的一个Python技巧!

实用干货:99%的人都不知道的一个Python技巧!

作者头像
测试开发技术
发布2022-12-27 18:30:45
4820
发布2022-12-27 18:30:45
举报
文章被收录于专栏:测试开发技术测试开发技术

上课通知:重磅消息 | 2022年最新全栈测试开发技能实战指南(第3期)

PS: 全栈测开训练营,本周进入Python编程版块(零基础,有基础皆适合)!

今天给大家分享一个Python开发实用小干货:如何将Python公共函数设置全局可用

在日常Python开发过程中,需要根据不同的功能用途,将代码划分在不同的模块下即不同.py文件中。例如项目中有一个名称为common.py公共模块,专门用于存放项目公共函数,假设在common.py模块中,有一个用于统计函数运行的装饰器函数,示例代码如下:

代码语言:javascript
复制
"""
定义一个计算函数运行时间的装饰器(计算时间使用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即可。

1、常规写法

web_app.py调用common.py中的函数,常规方法:

代码语言:javascript
复制
# 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运行项目,示例代码如下:

代码语言:javascript
复制
from web_app import web_app_funa
web_app_funa()

运行结果如下:

这种情况虽然可以达到目的,但如果项目中有非常多的模块都需要调用common.py中的公共函数,意味着所有的模块中都要重复导入类似代码:

代码语言:javascript
复制
from common import wrapper
from common import xxx

这种写法,工作量存在重复,且效率低下,今天就给大家分享一个相对更为高级的用法,可以让我们调用Python自定义模块时,特别是一些公共模块,可以像使用Python中的内置函数一样,不用导入,而是直接使用!

2、高级写法

讲之前,大家可以先思考一个问题?大家是否有想过,为什么平时我们在使用print时,可以直接使用,而不用导入,是因为Print这类型函数被称之为Python的内置函数,那是否我们可以让我们自定义的Python函数也变成“内置函数”呢?答案是可以的。

builtins是Python的内建模块,所谓内建模块就是你在使用时不需要import,在Python启 动后,在没有执行程序员编写的任何代码前,Python会加载内建模块中的函数到内存中。除了print,常见的还有abs,str,type等。

具体怎么操作呢?直接贴代码:

1、main.py(项目主入口)

代码语言:javascript
复制
import builtins
from common import wrapper
setattr(builtins, 'wrapper', wrapper)
from web_app import web_app_funa
web_app_funa()

2、web_app.py(项目模块文件)

代码语言:javascript
复制
# 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中的这三句代码中

代码语言:javascript
复制
import builtins
from common import wrapper
setattr(builtins, 'wrapper', wrapper)

我们只需要在运行项目文件(入口)中,导入我们需要的公共模块,然后使用setattr把它设置成builtins内置模块中的一个属性即可。其中第二个参数是全局调用的名称,可以自定义修改,但请注意不要和Python本身的内置函数名冲突即可,第三个参数是你需要注册的工具函数。

完成这几步后,你就可以在任何py文件里直接通过注册的全局名称调用公共模块中的函数了,就跟使用print一样,是不是很酸爽!赶紧收藏起来,试试吧!

如果这篇文章对你有所帮助,或者有所启发的话,帮忙点赞、在看、转发、收藏,你的支持就是我坚持下去的最大动力!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上课通知:重磅消息 | 2022年最新全栈测试开发技能实战指南(第3期)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档