• 超实用 :大部分的人都不知道的一个Python技巧


    今天给大家分享一个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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    该统计函数运行时间的功能,其他模块(例如有:web_app.py、h5_app.py)都会调用到,正常情况下,如果要实现这种模块相互调用,使用from xxx import xxx即可。

    1、常规写法

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    假设项目启动文件为main.py,直接调用main.py运行项目,示例代码如下:

    from web_app import web_app_funa
    web_app_funa()
    
    • 1
    • 2

    运行结果如下:

    在这里插入图片描述

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

    from common import wrapper
    from common import xxx
    
    • 1
    • 2

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

    2、高级写法

    讲之前,大家可以先思考一个问题?大家是否有想过,为什么平时我们在使用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()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行结果如下:

    在这里插入图片描述

    可以看到在web_app.py文件中,我们使用@wrapper装饰器函数时,并没有提前导入,但仍然可以正常使用。

    答案就在main.py中的这三句代码中

    import builtins
    from common import wrapper
    setattr(builtins, 'wrapper', wrapper)
    
    • 1
    • 2
    • 3

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

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

    喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!
    在这里插入图片描述

  • 相关阅读:
    3 分钟为英语学习神器 Anki 部署一个专属同步服务器
    [开源]一款面向普通人的AI桌面APP工具箱简单方便使用
    redis的原理和源码-主从复制的原理介绍
    C++ day5
    JDBC-04:PreparedStatement针对不同表的通用查询操作
    flutter 安装流程
    学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计
    理解李彦宏的“不卷模型,卷应用”理念
    项目上线整体流程
    流程控制-For循环语句
  • 原文地址:https://blog.csdn.net/wx17343624830/article/details/126870791