• 【Python】import模块的多种操作


    前言

    记录一下关于Python在导入模块时候一些操作~

    知识点📖📖

    Python魔法方法:__all__
    Python内置模块:importlib

    实现

    指定导出的变量

    当你在使用 from xxx import * 时候,可以通过 __all__ 来指定可被导出的变量
    虽然 from xxx import * 极其不优雅,但如果在编程中定义了许多变量的话,那导入还是令人头疼的

    项目组织如下:

    demo_package/
    	__init__.py
    	a.py
    	b.py
    
    • 1
    • 2
    • 3
    • 4

    a.py

    def say_hi():
        print('hi')
    
    
    def say_hello():
        print('hello')
    
    
    # 只导出 say_hi 方法
    __all__ = ['say_hi']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    b.py

    from a import *
    
    say_hi()
    say_hello()
    
    • 1
    • 2
    • 3
    • 4

    程序b.py 执行如下所示:

    • 如不指定导出的变量,是无法调用的。

    在这里插入图片描述

    优雅的导包

    在package里,如果有多个文件,这时候需要导入这些文件的变量,
    可以通过在__init__.py 中里填写需要导入的变量,从而使得可以根据 package 名称导入变量,使得代码更加优雅

    项目组织如下:

    demo_package/
    	__init__.py
    	a.py
    	b.py
    
    • 1
    • 2
    • 3
    • 4

    a.py

    def func_a():
        ....
    
    • 1
    • 2

    b.py

    def func_b():
        ....
    
    • 1
    • 2

    __init__.py 填写以下内容

    __init__.py

    from .a import func_a
    from .b import func_b
    
    • 1
    • 2

    一般的导入是

    from demo_package.a import func_a
    from demo_package.b import func_b
    
    • 1
    • 2

    而做了上述修改之后,导入这些变量的代码如下:

    from demo_package import func_a
    from demo_package import func_b
    
    • 1
    • 2

    重新加载模块

    在生产环境中,应该是用不上这个功能;
    但如果是在调试时候,这个功能还是挺好用的。因为当你修改了你的代码后,可以通过重新加载模块就立即生效,而不用等待下一次执行再生效。

    # 导入模块
    import module
    
    """中间你对module 做了修改"""
    
    # 重新导入模块
    importlib.reload(module)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    字符串导入模块

    通过字符串来导入模块,这个功能我是找不到应用场景~
    只是觉得有趣,就记录一下!!

    通过字符串导入模块.py

    import importlib
    
    module_name = importlib.import_module('module_name')
    
    • 1
    • 2
    • 3

    简单示例.py

    import importlib
    
    
    def create_func(_str: str):
        return importlib.import_module(_str)
    
    
    func = create_func('math')
    print(func.__name__)
    print(func.sin(2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    output:

    math
    0.9092974268256817
    
    • 1
    • 2

    后话

    怎么样,用不上的知识又增加了吧!!
    本次分享到此结束,🐱‍🏍🐱‍🏍
    see you~


  • 相关阅读:
    RabbitMQ的 AMQP协议都是些什么内容呢
    Qt元对象系统
    35-Jenkins-共享库应用
    【家具建模三剑客】3DMAX一键生成软包插件BreadMaker面包机插件使用教程
    Lwip之SNMP协议与实现
    【单片机基础】ADC0832详解
    【node.js 入门篇】三分钟实现简单服务器功能
    备战蓝桥杯之并查集刷题之删除
    vue如何动态加载显示本地图片资源
    NoSQL之 Redis配置与优化
  • 原文地址:https://blog.csdn.net/weixin_45081575/article/details/127412203