【问题标题】:Import modules that "overload" one another, but keep namespaces导入相互“重载”但保留命名空间的模块
【发布时间】:2018-04-19 00:18:13
【问题描述】:

我有两个由另一个开发人员编写的模块:modulemodule_overload。模块module_overload 替换了module 的一个子集。开发者推荐的导入方式是:

from module import *
from module_overload import *

但我想保留命名空间。如果我这样做...

import module
import module_overload as module

...module 的完整集丢失,只有 module_overload 的替换子集可用。

如何执行此导入,但保留命名空间?

【问题讨论】:

  • 你不应该尝试将它全部保存在同一个命名空间中。使用import module_overload as mo 或类似的东西,并相应地为所有更新的函数添加前缀。否则,您将丢失一些关于您的代码的明确内容,并且以后可能会遇到问题,例如,如果 module_overload 中的函数名称发生更改,您的代码将回退到原始模块中的那个,在您获得错误报告。
  • 这是个好建议。我打算用这个方法。
  • 可能有几个合理的解决方案。作为一个长期的解决方案,在应用程序中导入这两个模块似乎不是一个好主意。我不知道第二个重载模块是否提供替代方案或替换原始模块的功能?一种方法可能是让重载模块在内部导入原始模块并使用更新的函数对其进行修补。然后你只需要导入一个模块,这取决于你的需要。
  • module_overload 导入 module。然后,对于它重载的类,它会创建一个继承module 的新类:class Class(module.Class)。它还添加了module 中没有的新类和函数。所以,重申一下,您是在建议我只导入module_overload,然后使用module_overload.modulemodule 访问非重载类?这很有意义。
  • 我对 python 模块了解不多,但在我看来,您希望两个模块都呈现尽可能相似的界面。所以module_overload.module 选项可能不太好。我更多地认为module_overload 只会转发它没有超载的任何功能。我认为您不需要任何给定文件中两个模块的同名函数?几个cmets很难制定一个好的计划。也许我最初的建议在短期内是好的,但您可能想与您的同事讨论更长期的解决方案?

标签: python python-3.x python-module


【解决方案1】:

我不明白哪个开发者认为这是个好主意,但模块是对象,您可以使用 update 更新他们的 __dict__

你先导入module_overload:

import module_overload
import module as temp
module_overload.__dict__.update(temp.__dict__)
module = module_overload

大概是这样。

毛。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2021-03-20
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多