当前位置: 首页 > article >正文

python3 强制使用任意父级相对导入,越过python相对导入限制,拒绝 ImportError

前言

  1. 单纯不喜欢 python 对 点开头的包的限制,好麻烦,遂写了本包,来解决这个问题
  2. 启用本模块后,你可以随时使用 单个点来导入当前目录的模块,也可以使用多个 点导入多级父目录内的模块,而不会报错烦人的模块相对路径限制错误。

解决

写了一个强制相对导入特性,修改了 import 的实现逻辑,从而允许导入任意父级的包,而不会报以下错误。
ImportError attempted relative import with no known parent package
ImportError attempted relative import beyond top-level package

修改import逻辑的方法来自这里
修改 python3 的 import 函数,从而实现挂钩hook或更改其行为
https://blog.csdn.net/ONE_SIX_MIX/article/details/128717665

仓库

github:https://github.com/One-sixth/force-relative-import

以下为搬过来的仓库介绍。

force-relative-import

这是一个强制启用python相对导入的库,允许你忽略python的相对导入限制。

安装

pip install -U force-relative-import

使用方法

目录示例,example_N 均为直接启动目标

├─example
│  │  example_1.py
│  │  example_2.py
│  │  example_3.py
│  │  moduleA.py
│  │
│  └─example_4
│      │  example_4.py
│      │
│      └─example_5
│              example_5.py

方法1 (推荐用于模块编写)

使用作用域,以避免意外情况。

example_1.py

from force_relative_import import enable_force_relative_import

with enable_force_relative_import():
    from .moduleA import return_good

print(return_good())

example_4.py

from force_relative_import import enable_force_relative_import

with enable_force_relative_import():
    from ..moduleA import return_good

print(return_good())

example_5.py

from force_relative_import import enable_force_relative_import

with enable_force_relative_import():
    from ...moduleA import return_good

print(return_good())

方法2

使用函数。

example_2.py

from force_relative_import import enable_force_relative_import, global_enable_force_relative_import, global_disable_force_relative_import

global_enable_force_relative_import()

with enable_force_relative_import():
    from .moduleA import return_good

global_disable_force_relative_import()

print(return_good())

方法3 (推荐仅用于主程序入口)

仅建议用于主程序,不要用于模块或包。

example_3.py

from force_relative_import import enable_now

from .moduleA import return_good

print(return_good())



http://www.kler.cn/news/17128.html

相关文章:

  • 操作系统——设备管理
  • kafka的安装与使用
  • 关于低代码开发平台的一些想法
  • 【Frame.h】
  • 手写堆priority_queue优先队列
  • 题目:16版.学生-成绩关联实体
  • Centos7快速安装Kibana并连接ES使用
  • 结合SSE实现实时位置展示与轨迹展示
  • 区块链系统探索之路:基于椭圆曲线的私钥与公钥生成
  • FPGA/Verilog HDL/AC620零基础入门学习——8*8同步FIFO实验
  • spring-模型数据和视图---视图解析器的说明以及大量代码演示
  • AUTOSAR知识点Com(十三):ComM内容分析
  • 后端程序员的前端必备【Vue】- 01 Vue入门
  • 计算机Z20-第7-8周作业
  • 17. Pod 自动管理——DeamonSet 和 Job
  • JDK8 中Arrays.sort() 排序方法解读
  • MySQL高阶——索引设计的推演
  • Redis-集合(Set)
  • 总结838
  • Java 中的异常处理机制是什么(十)
  • redis 持久化 RDB + AOF
  • 多城市门店店铺展示地图导航pc/h5系统开发
  • Packet Tracer - 研究直连路由
  • 第十五章 角色移动旋转实例
  • ubuntu16.04升级到20.04后报错 By not providing “FindEigen.cmake“
  • 超细Redis(一)
  • MySQL 一条SQL语句是如何执行的?
  • JVM调优入门指南:掌握步骤、参数和场景
  • 【前端面经】浏览器-http和https的区别及优缺点?
  • TensorRT:自定义插件学习与实践 002:实现GELU