Python中的__init__.py的高级用法

2023-11-10

        刚开始学习编程,我们很少会关注这个文件,只知道一个目录中存在该文件,该目录就是一个package,不存在就是普通的目录,普通的目录在导入包时,pycharm并不会智能提示。

        Python中每新建一个package都会默认生成一个__init__.py文件,在做Python项目时,会存在很多个package,这时候__init__.py可以发挥强大的作用,我们可以在__init__.py文件中写一些代码方便我们调用该package下的模块。

1. __init__.py是何时调用的

当我们import某个package时,会首先调用该package下的__init__.py

package1/
        __init__.py
        subPack1/
                __init__.py
                module_11.py
                module_12.py
                module_13.py
        main.py

例如我们存在一个项目,目录结构如上所示,在 subPack1下的__init__.py下我们增加如下代码

print(f'this is __init__.py of subPack1')

然后我们在main.py文件中导入subPack1, main.py文件中的代码如下:

import subPack1

直接运行main.py,这是我们可以看到控制台输出:

2.  __init__.py何时使用(应用场景)

        当我们开发项目时,会存在多个package,但是我们在导入包的时候会使用绝对路径,这样在多个文件都引用时,会显得特别麻烦,这时候我们就可以利用每个package中的__init__.py文件,最终的结果就是简洁易读。

        我们可以想一下,当我们使用第三方包pandas时,是如何导入的DataFrame()类的,使用如下的语句就可以直接导入进来:

from pandas import DataFrame

我们下面就一探究竟,为什么这样就直接可以使用 DataFrame,通过查看pandas安装包,我们可以发现DataFrame()是在frame.py模块下,目录结构如下:

下面我们就看看,这是如何做到的

首先我们看一下core package的__init__.py中有哪些内内容,很抱歉,这个文件是空的,啥也没有,那么接下来我们就看上一级package pandas下的__init__.py中有哪些内容:

有用的内容如下:

可以看到pandas package从pandas.core.api中导入了DataFrame类

from pandas.core.api import (
    # dtype
    Int8Dtype,
    Int16Dtype,
    Int32Dtype,
    Int64Dtype,
    UInt8Dtype,
    UInt16Dtype,
    UInt32Dtype,
    UInt64Dtype,
    Float32Dtype,
    Float64Dtype,
    CategoricalDtype,
    PeriodDtype,
    IntervalDtype,
    DatetimeTZDtype,
    StringDtype,
    BooleanDtype,
    # missing
    NA,
    isna,
    isnull,
    notna,
    notnull,
    # indexes
    Index,
    CategoricalIndex,
    Int64Index,
    UInt64Index,
    RangeIndex,
    Float64Index,
    MultiIndex,
    IntervalIndex,
    TimedeltaIndex,
    DatetimeIndex,
    PeriodIndex,
    IndexSlice,
    # tseries
    NaT,
    Period,
    period_range,
    Timedelta,
    timedelta_range,
    Timestamp,
    date_range,
    bdate_range,
    Interval,
    interval_range,
    DateOffset,
    # conversion
    to_numeric,
    to_datetime,
    to_timedelta,
    # misc
    Flags,
    Grouper,
    factorize,
    unique,
    value_counts,
    NamedAgg,
    array,
    Categorical,
    set_eng_float_format,
    Series,
    DataFrame,
)

我们接下来看看pandas.core.api这个模块中有哪些内容,可以看到该文件中存在如下代码:

# DataFrame needs to be imported after NamedAgg to avoid a circular import
from pandas.core.frame import DataFrame  # isort:skip

这样我们的思路就理顺了,另外说一点pandas.core.api中的内容完全可以方法core下的__init_.py中。

        我们来理一下思路, 看下图结构,pandas.core.api中导入了DataFrame类,那么该文件中就存在DataFrame()类,可以使用print(dir())代码输出当前模块包含的其他对象。这样在最外侧的pandas包中的__init__.py中就可以使用绝对路径导入pandas.core.api文件中已经存在的DataFrame()类,这样我们在使用pandas时就可以直接from pandas import DataFrame使用了,如果__init__.py文件中没有任何内容,那么每次使用,我们就必须以绝对路径导出DataFrame类,这样一是不方便寻找,再一个是代码看起来可读性差。

 除了上述作用以外,我们还可以看到pandas包下的__init__.py文件中还有如下内容:就是检查pandas包的依赖,这样每次用户导入pandas包是,就会立刻检查依赖是否存在,如果不存在,将会报错,提示用户安装。

hard_dependencies = ("numpy", "pytz", "dateutil")
missing_dependencies = []

for dependency in hard_dependencies:
    try:
        __import__(dependency)
    except ImportError as e:
        missing_dependencies.append(f"{dependency}: {e}")

if missing_dependencies:
    raise ImportError(
        "Unable to import required dependencies:\n" + "\n".join(missing_dependencies)
    )
del hard_dependencies, dependency, missing_dependencies

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中的__init__.py的高级用法 的相关文章

随机推荐

  • PHP本地环境搭配——WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法

    WAMP不能启动 一直处于红色图标 正常启动为绿色吧 考虑是端口的问题 我找到wamp文件夹中的wamp bin apache apache2 2 22 conf路径下的httpd conf文件 将 Listen 12 34 56 78 8
  • windows下进入DOS命令无法切换目录

    问题呈现 运行 gt cmd gt cd E redis redis2 8 此时无法切换指定目录 E redis redis2 8 解决办法 1 运行 gt cmd gt E 2 回车
  • JavaScript一次替换字符串中多个

    问题 在JavaScript中对字符串替换时可能出现想要替换的字符串strB在原字符串strA中出现多次 而string replace方法只能替换一个字符串strB 解决方法 多次使用replace替换 使用replace 正则表达式替换
  • Rust 编程: 条件编译-Features

    Rust 编程 条件编译 Features Rust 支持条件编译 可通过两种不同的操作实现 cfg 属性 在属性位置中使用 cfg cfg 宏 在布尔表达式中使用 cfg 根据操作系统引用不同文件的相同模块 cfg attr target
  • java-在数组中,用二分法查找一个数。返回下标,找不到则返回-1。

    编写程序 完成下列功能 1 输入 20 个整数到数组中 2 对 20 个数按从大到小的顺序排序 输出排序后的数组 3 输入一个整数 x 4 在数组中 用二分法查找 x 如果找到了输出 x 在数组中的下标 找不到输出 1 package la
  • python Image模块基本语法

    Python Image 基本的图像处理操作 有需要的朋友可以参考下 Python 里面最常用的图像操作库是 Image library PIL 功能上 虽然还不能跟Matlab比较 但是还是比较强大的 废话补多少 写点记录笔记 1 首先需
  • Power BI /Power BI Pro账户等基本概念介绍

    视频内容 Power BI 的基本概念 Power BI 的概念 Power BI 是一种商业分析解决方案 可帮助对数据进行可视化 共享可视化报表 或将报表嵌入应用或网站中 Microsoft Power BI 是一系列的软件服务 应用和连
  • 组件封装

    基本用法 在使用 vue cli 创建的项目中 组件的创建非常方便 只需要新建一个 vue 文件 然后在 template 中写好 HTML 代码 一个简单的组件就完成了 一个完整的组件 除了 template 以外 还有 script和
  • Cannot find module ‘@/views/test/index.vue‘ or its corresponding type declarations.ts(2307)的原因

    在Vue的TypeScript项目中 使用const test gt import views test index vue 语法动态导入模块时 可能会出现类型声明文件找不到的错误 这是由于TypeScript无法正确解析动态导入的路径而导
  • 五线舵机驱动程序_16路舵机驱动板程序使用说明

    用Arduino类库驱动舵机并不是一件难事 如果需要驱动很多电机 就需要要占用更多的引脚 也会影响到Arduino的处理能力 专门的舵机驱动板很好的解决了这个问题 此舵机驱动板使用PCA9685芯片 是16通道12bi tPWM舵机驱动 用
  • 2020年“泰迪杯”数据分析职业技能大赛A 题优秀报告:教育平台的线上课程智能推荐策略

    摘要 近年来 随着互联网与通信技术的高速发展 学习资源共享与建设呈现出新的发展趋势 多样化的线上教育平台如雨后春笋般争相涌入大众视野 尤其是在今年年初 受新冠肺炎疫情的冲击下 学生返校进行线下授课收到严重阻碍 由此 网络线上平台由此成为 互
  • 字节跳动精准测试实践,SmartEye背后的设计逻辑

    简介 在移动互联网高度发展下 移动APP趋近于大型化 功能也趋近于复杂化 诸如各种国民级应用 功能 玩法等迭代不停 其背后对应的研发协作团队也非常庞大 在此种场景下 依靠人力堆叠去保障产品质量 并非最优解 在软件规模达到某个临界点之后 问题
  • [论文] LIMA: Less Is More for Alignment

    文章目录 概要内容 关键方法 高质量样本获取 模型评估方法 结论 思考 Meta新模型LIMA 基于LLaMa 65B 精选1000个微调样本进行训练 对比GPT 4 Bard DaVinci003 表现出强大的性能 结果表明 大语言模型中
  • 程序员mac开发环境配置

    拿了一台新的macbook pro 作为一个程序员 我把自己的开发环境给贴出来 1 输入法 先把苹果的系统自带的中文输入法 换成自己习惯的搜狗输入法 2 略 3 jdk 7u71 直接下载dmg文件安装 4 git 在terminal中 直
  • 中国职场女性领导者专题访谈

    导读 书写中国职场女性领导者并不容易 一不小心就会落入成功学后验主义窠臼 狭隘单一的价值评判 亦或是隐形性别偏见 但我们还是坚定地提笔 因为每一位女性领导者的成长历程 无论高光时刻还是黑暗片段 都会通过文字与读者产生连接 为其带来启示 而我
  • 服务器计算机性能测试,服务器平台计算性能工具Linpack服务器性能测试利器_一_.pdf...

    服务器平台计算性能工具Linpack服务器性能测试利器 一 pdf 产 品 技 术 服务器平台 文 赵吉志 计算性能工具Linpack 服务器性能测试利器 一 计算机硬件的不断升级带来了系统处理性能的持续提高 如何对平台的性能作出正确的判断
  • Linux基础(命令学习) ———从入坑到放弃1.0

    Linux文件 一 系统层次图 Linux文件类型 在Linux中一切都是文件 但文件都得有类型 shell 对命令的解释 cd pwd 查看当前的工作目录 Is 列表显示目录内容 alias 设置别名 du 统计目录及文件空间占用情况 m
  • SpringBoot的基本使用

    SpringBoot 目录 SpringBoot 一 SpringBoot简介 1 什么是SpringBoot 2 SpringBoot的优点 3 SpringBoot的缺点 二 SpringBoot的创建方式 1 基于官网的Initial
  • 【vue运行报错】There are multiple modules with names... 报错原因和解决办法

    项目场景 There are multiple modules with names that only differ in casing 项目运行时候报错如下 There are multiple modules with names t
  • Python中的__init__.py的高级用法

    刚开始学习编程 我们很少会关注这个文件 只知道一个目录中存在该文件 该目录就是一个package 不存在就是普通的目录 普通的目录在导入包时 pycharm并不会智能提示 Python中每新建一个package都会默认生成一个 init p