[英]What is the most Pythonic way to pass objects between imported libraries of code?
我有一个程序导入两个模块,一个我们将调用operations
(这只是一系列功能),另一个我们称为tracking
(这是一个类)。 程序tracking
模块监视一系列消息,具有一些错误状态标志,等等。 该节目种类信息tracking
的严重程度和有关各方,然后在最后甩掉这个不同的文件。
我使用myTrack = tracking.Tracking()
创建了跟踪类的单个实例。 (是的,这是全球状态,因此很糟糕 ,但它非常方便)
不幸的是,我想在operations
模块中使用我的tracking
对象,只是为了跟踪错误和警告。 看起来我可以将myTrack
作为参数传递给operations
模块中的函数,修改每个函数。
但是,有没有“更好”或“更多Pythonic”的方式来做到这一点? 我怀疑有一些名称空间,我无法掌握。
有很多方法可以重构这个,但是你可以开始的一个地方是在你的operations
模块中添加一个track()
函数。 默认情况下它没有任何作用。
def track(message): # use the right signature though!
pass
在您的operations
模块中,您可以在想要跟踪某些内容的任何地方调用track()
函数。
假设您的Tracking
对象有一个名为track()
的方法来执行实际跟踪,那么在主模块中,您可以执行以下操作:
myTrack = tracking.Tracking()
operations.track = myTrack.track
这将使用Tracking
实例中的方法替换模块的(无操作) track
功能。
基本上,您提供了一个“钩子”,任何人都可以使用它来向您的operations
模块添加跟踪,然后自己使用该钩子。
是的,这是更“全球化的国家”,但它是全球性的模块,而不是真正的全球化。
我不确定我是否正确理解了您的问题,但我认为您正在寻找一种方法,使一个模块中的函数能够自动识别另一个模块中的对象状态,而无需在每次调用函数时显式传递该对象。
基本问题是,在某种程度上,您必须传递对象并使其可用于您需要的所有功能。 模块根本不适合那样工作。
我认为更好的想法是定义一个Operations
类,它包含您作为方法所需的所有函数以及持有Tracking
实例。 您只需传入Tracking
对象并创建一个Operations
实例,然后使用它来调用您需要的任何函数。
myTrack = tracking.Tracking()
myOperation=operations.Operations(myTrack)
myOperation.doSomething()
您的tracking
模块(记录有关一系列事件的详细信息以供以后分析或显示)听起来很像标准库的logging
模块。 所以你可能想要更仔细地调查一下。
如果您决定沿着那条路走,那么operations
模块只会将事件记录到特定的记录器(例如“myapp.operations”),您的tracking
模块将提供一个记录处理程序,它可以执行您想要的操作,并且您的主模块将挂钩两者一起(通过使用“myapp.operations”记录器注册跟踪处理程序)。
您也可以自己设置类似的东西,但实际上,如果您想在Python程序中跟踪事件......只需使用logging
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.