在导入的代码库之间传递对象的Pythonic方法是什么?

时间:2011-04-05 18:59:45

标签: python

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

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

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

然而,有没有“更好”或“更多Pythonic”的方式来做到这一点?我怀疑命名空间有些东西我无法掌握。

3 个答案:

答案 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