我有一个导入两个模块的程序,一个我们将调用operations
(这只是一系列函数),另一个我们调用tracking
(这是一个类)。程序tracking
模块监视一系列消息,具有一些错误状态标志,等等。程序按严重性和相关方对tracking
中的信息进行排序,然后将其转储到最后的不同文件中。
我使用myTrack = tracking.Tracking()
创建跟踪类的单个实例。 (是的,这是global state and therefore bad,但它非常方便)
不幸的是,我想在tracking
模块中使用我的operations
对象,只是为了跟踪错误和警告。看起来我可以将myTrack
作为参数传递给operations
模块中的函数,修改每个函数。
然而,有没有“更好”或“更多Pythonic”的方式来做到这一点?我怀疑命名空间有些东西我无法掌握。
答案 0 :(得分:4)
有很多方法可以重构这一点,但您可以开始的一个地方是向track()
模块添加operations
函数。默认情况下它没有任何作用。
def track(message): # use the right signature though!
pass
在operations
模块中,您可以在任意位置调用track()
功能。
假设您的Tracking
对象有一个名为track()
的方法来执行实际跟踪,那么在您的主模块中,您可以执行此操作:
myTrack = tracking.Tracking()
operations.track = myTrack.track
这将使用track
实例中的方法替换模块的(不执行任何操作)Tracking
函数。
基本上,您提供了一个“钩子”,任何人都可以使用它来向您的operations
模块添加跟踪,然后自己使用该钩子。
是的,这更像是“全球状态”,但它是全球性的模块,并不是全球性的。
答案 1 :(得分:3)
我不确定我是否正确理解了您的问题,但我认为您正在寻找一种方法来使一个模块中的函数自动识别另一个模块中的对象状态,而无需在每次调用函数时显式传递该对象
基本问题是,在某种程度上,您必须传递对象并使其可用于您需要的所有功能。模块根本不适合那样工作。
我认为更好的想法是定义一个Operations
类,其中包含您需要的所有函数作为方法以及保存Tracking
的实例。您只需传入Tracking
对象并创建一个Operations
实例,然后使用它来调用您需要的任何函数。
myTrack = tracking.Tracking()
myOperation=operations.Operations(myTrack)
myOperation.doSomething()
答案 2 :(得分:3)
您的tracking
模块(记录有关一系列事件的详细信息以供日后分析或显示)听起来像标准库的logging
模块。所以你可能想要更仔细地研究一下。
如果您决定沿着那条路走下去,那么operations
模块只会将事件记录到特定的记录器(例如“myapp.operations”),您的tracking
模块将提供一个记录处理程序,做了你想要的,你的主要模块将两者连在一起(通过使用“myapp.operations”记录器注册跟踪处理程序)。
你也可以自己设置类似的东西,但实际上,如果你想跟踪Python程序中的事件......只需使用logging
。