我有一个导入两个模块的程序,一个我们称为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/