繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM