【问题标题】:What is the most Pythonic way to pass objects between imported libraries of code?在导入的代码库之间传递对象的最 Pythonic 方式是什么?
【发布时间】:2011-07-30 05:54:46
【问题描述】:

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

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

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

但是,是否有“更好”或“更 Pythonic”的方式来做到这一点?我怀疑命名空间中有一些我没能掌握的东西。

【问题讨论】:

    标签: python


    【解决方案1】:

    我不确定我是否正确理解了您的问题,但我认为您正在寻找一种方法来使一个模块中的函数自动了解另一个模块中的对象的状态,而无需在每次调用函数时显式传递该对象.

    基本问题是,在某种程度上,您必须传递对象并使其可用于您需要的所有功能。模块根本不应该那样工作。

    我认为更好的主意是定义一个Operations 类,该类包含您需要的所有函数作为方法,并保存Tracking 的实例。您只需传入您的 Tracking 对象并创建一个 Operations 实例,然后使用它来调用您需要的任何函数。

    myTrack = tracking.Tracking()
    myOperation=operations.Operations(myTrack)
    myOperation.doSomething()
    

    【讨论】:

    • 这也是一个很好的解决方案,对我来说只是比 kindall 的要差一点。
    • 我们的两个解决方案实际上几乎相同,只是我使用模块作为命名空间(因为它已经是一个单例对象)并且 MAK 建议为此使用一个类。
    • 您不需要将myTrack 传递给Operations() 构造函数吗?
    【解决方案2】:

    有很多方法可以重构它,但您可以从一个地方开始将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 模块添加跟踪,然后自己使用该钩子。

    是的,这更像是“全局状态”,但它是模块全局的,并不是真正的全局。

    【讨论】:

    • 啊,然后我可以在消息中使用 *args 以防我更改跟踪模块中的参数!
    • 我不一定会使用*args,因为列出函数的实际参数是很好的文档。如果您更改 tracking 模块的签名,则无论如何您都必须在 operations 模块中更改对 track() 的每次调用,这样您就可以在其中更新虚拟函数的签名。跨度>
    • 另外,如果你想真的喜欢并允许任何数量的其他功能附加到这个“钩子”上,你可以使用我想出的类似问题我有:stackoverflow.com/questions/4309607/…
    【解决方案3】:

    您的tracking 模块(记录有关一系列事件的详细信息以供以后分析或显示)听起来很像标准库的logging 模块。所以你可能想更仔细地调查一下。

    如果你决定走这条路,那么operations 模块只会将事件记录到特定的记录器(例如“myapp.operations”),你的tracking 模块会提供一个日志处理程序来满足你的需求,并且您的主模块会将两者挂钩(通过使用“myapp.operations”记录器注册跟踪处理程序)。

    您也可以自己设置类似的东西,但实际上,如果您想在 Python 程序中跟踪事件...只需使用 logging。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 2014-08-05
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多