- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在寻找允许用户覆盖应用程序中的模块或使用新模块扩展应用程序的技术。
想象一个名为 pydraw 的应用程序。目前提供了一个Circle类,继承了Shape。包树可能如下所示:
/usr/lib/python/
└── pydraw
├── __init__.py
├── shape.py
└── shapes
├── circle.py
└── __init__.py
现在假设我想启用动态发现和加载实现新形状的用户模块,甚至可能是 Shape 类本身。用户的树与应用程序树具有相同的结构似乎是最直接的,例如:
/home/someuser/python/
└── pydraw
├── __init__.py
├── shape.py <-- new superclass
└── shapes
├── __init__.py
└── square.py <-- new user class
换句话说,我想用用户树中的同名文件覆盖和屏蔽应用程序树,或者至少从 Python 的角度获得明显的结构。
然后,通过配置 sys.path 或 PYTHONPATH,可能会发现 pydraw.shapes.square。但是,Python 的模块路径搜索并没有找到诸如 square.py 之类的模块。我认为这是因为 __method__
已经在另一个路径上包含了一个父模块。
您将如何使用 Python 完成这项任务?
最佳答案
扩展的发现可能有点脆弱和复杂,并且还需要您查看所有可能非常大的 PYTHONPATH。
相反,有一个配置文件列出了应该加载的插件。这可以通过将它们列为模块名称来完成,并且还要求它们位于 PYTHONPATH 中,或者通过简单地列出完整路径来完成。
如果你想要每个用户级别的配置,我会同时拥有一个列出模块的全局配置文件和一个每个用户的配置文件,并且只读取这些配置文件而不是尝试一些发现机制。
此外,您不仅要尝试添加插件,还要覆盖应用程序的组件。为此,我会使用 Zope Component Architecture。然而,它还没有完全移植到 Python 3,但它被设计用于这种情况,尽管从你的描述来看这似乎是一个简单的情况,而且 ZCA 可能有点矫枉过正。但无论如何都要看看。
关于oop - 在 Python 中启用用户代码扩展的流行技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201397/
我想知道是否有一个“标准”类(JDK、Guava、Apache *)可以帮助延迟初始化/计算模式? 我正在考虑这样的事情(现在让我们忽略同步): abstract class Lazy { T i
我要创建一个从 html 到某种格式的转换器。我正在考虑使用中间格式 XML(XSL-FO)。 我的问题:如果没有那么多应用程序渲染它,为什么 FO 格式很受欢迎? 最佳答案 我很清楚 CSS 和 X
我发现了 IDEF就在昨天,我立即想知道为什么它不比 UML 更流行。从documents来看,IDEF 至少与 UML 一样适用于软件建模,但与 UML 相比,它已经成熟和稳定了大约 30 年。 这
首先,对于版主来说,如果这不是发布此内容的正确位置,请不要生气:)。 我想知道是否有类似 TodoMVC 的东西适用于 Django、Rails、Symfony 等流行的 Web 框架。 如果没有这样
在我的应用程序中,我有一个 UIScrollView,其中包含 N 个可以向左或向右滑动的 ViewController 在每个 Controller 中,我希望能够推送新的 viewControll
我是一名优秀的程序员,十分优秀!