修改django中的子包

时间:2014-08-02 23:58:36

标签: python django python-import

我遇到了一个问题,我需要在django中更改大包的子包。大包,让我们说foo,包括很多子包,我想修改其中一个,比方说吧。 在权衡了许多选项后,我决定在我的django项目启动时动态更改sys.modules。我做的是这样的:

INSTALLED_APP=(...)
import sys, myproject.mybar #mybar is the the modified version
sys.modules['foo.bar']=myproject.mybar

这在大多数情况下都能正常工作,只要“从foo.bar导入x,y,z”发生,就可以将其重定向到myproject.mybar。但是,在foo包中的某个地方,有一个像

这样的导入语法
import foo.bar.x
user = foo.bar.x.get_user(request)

这会导致“'模块'对象没有属性”异常。 Mybar包有x模块和get_user()方法,我不知道为什么会这样。任何人都可以帮我指出我在这里想念的东西,还有任何建议以更加pythonic和djangonic的方式做我想要实现的目标(修改子包装)?

P.S。 foo包非常大,我不想在myproject中包含所有这些。 感谢您提前帮助Python社区(:

1 个答案:

答案 0 :(得分:0)

我的猜测是你得到的是AttributeError,因为你正在修补包中的某个地方,它有一个__init__.pyimports来自你编辑的模块的函数和类。然后在包中的其他地方,它试图将这些函数和类用作模块的属性。

在我看来,这是为什么修改sys.path以便将特定替换模块作为大型第三方软件包的依赖项注入是一个可怕的想法的一个例子。此外,将来如果此软件包更新会发生什么?

在我看来,一个更简单的解决方案是1)分叉项目(取决于许可证),2)进行修改,3)设置上游到原始项目(所以你仍然可以接收更新), 4)安装你的分叉版本。

通过这种方式,你有一个小得多的问题:当包导入自己的东西时,你只需要担心你编辑的代码表现得恰当(这就是你应该添加测试用例的原因)对于您的编辑并运行包提供的所有测试)。