Python中如何通过自定义模块为svgpathtools的已有类添加扩展功能?
解决方案
你遇到的两个报错本质是自定义的包名和第三方官方库svgpathtools重名,导致导入逻辑混乱,按以下步骤调整即可:
1. 调整目录结构
首先修改自定义模块的顶层目录名,避免和官方库重名,示例结构如下:
├── svgpathtools_extensions # 改个不冲突的名字即可 │ ├── __init__.py │ └── distance.py
2. 调整模块代码
distance.py 代码
不需要修改业务逻辑,目录名不冲突后import svgpathtools会自动导入pip安装的官方库:
import svgpathtools import numpy def complex_distance(a, b): return ((a.real - b.real) ** 2 + (a.imag - b.imag) ** 2) ** 0.5 def foo(path_a, path_b): d = 0 for t in range(0, 101, 1): d += complex_distance(path_a.point(t / 100), path_b.point(t / 100)) return d / 100 # 给官方Path类注入扩展方法 setattr(svgpathtools.Path, 'foo', foo)
init.py 可选配置
如果希望用户只要导入扩展包就自动完成方法注入,不需要单独导入distance模块,可以在__init__.py中添加:
from . import distance
3. 验证使用
把svgpathtools_extensions目录放到Python可识别的导入路径下(比如项目根目录、site-packages目录),执行以下命令验证:
python3 -c "import svgpathtools_extensions.distance; import svgpathtools; p = svgpathtools.Path('M0 0 L10 10'); print(p.foo(p))"
正常会输出0.0,代表方法注入成功。
原报错原因说明
- 保留自定义
svgpathtools/__init__.py报错:Python导入时优先匹配当前目录下和官方库同名的自定义包,你的自定义包中没有定义/导入Path类,因此抛出AttributeError - 删除
__init__.py报错:Python不会将没有__init__.py的目录识别为合法包,因此找不到svgpathtools.distance模块,抛出ModuleNotFoundError
内容的提问来源于stack exchange,提问作者simone
相关产品推荐
相关产品推荐

