python - 在导入的代码库之间传递对象的最 Pythonic 方式是什么?

标签 python

我有一个导入两个模块的程序,一个我们称为operations(这只是一系列函数),另一个我们称为tracking(这是一个类(class))。程序 tracking 模块监视一系列消息,有一些错误状态标志,等等。该程序按严重性和相关方对tracking中的信息进行排序,最后将其转储到不同的文件中。

我使用 myTrack = tracking.Tracking() 创建了跟踪类的单个实例。 (是的,这是 global state and therefore bad ,但它非常方便)

不幸的是,我想在 operations 模块中使用我的 tracking 对象,只是为了跟踪错误和警告。看起来我可以将 myTrack 作为参数传递给 operations 模块中的函数,修改每个函数。

但是,是否有“更好”或“更 Pythonic”的方法来做到这一点?我怀疑有一些我没能掌握的 namespace 。

最佳答案

有很多方法可以重构它,但您可以从一个地方开始,即向您的 operations 模块添加一个 track() 函数。默认情况下不执行任何操作。

 def track(message):  # use the right signature though!
     pass

在您的 operations 模块中,您可以在任何您可能想要跟踪的地方调用您的 track() 函数。

假设您的 Tracking 对象有一个名为 track() 的方法来执行实际跟踪,那么在您的主模块中,您可以这样做:

myTrack = tracking.Tracking()
operations.track = myTrack.track

这会用您的 Tracking 实例中的方法替换模块的(不执行任何操作)track 函数。

基本上,您提供了一个“ Hook ”,任何人都可以使用它来向您的操作 模块添加跟踪,然后您自己使用该 Hook 。

是的,这更像是“全局状态”,但它是模块全局的,并不是真正的全局。

关于python - 在导入的代码库之间传递对象的最 Pythonic 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5557035/

相关文章:

python - 在 Internet Explorer 的 Jupyter Notebook 中不显示 Folium 热图

python - 如何列出模块中的所有功能?

python - wxpython/python中的 '&string'是什么意思

python - 与 Python 相比,Tensorflow C++ API 速度较慢

python - 具有多个数据库分片的 SQLAlchemy 声明模型

python - 如何将 django 模型的字段默认值定义为另一个字段值?

python - 如何强制 http.client 在 python 中发送分块编码的 HTTP 正文?

python - Django ORM 查询 : getting "has many" relation objects

python - 通过按 'Enter' 键而不是单击按钮来获取值

python - 解析根元素内元素之间的 XML 文本