如何让绝对导入在Python中工作?

时间:2018-04-18 20:17:36

标签: python import architecture python-import software-design

我知道有很多类似的关于Python导入的问题,所以我会尝试用不同的方式来表达它。我将饶恕你背后的绝望日子的细节,而是从更一般的角度来看待问题:在Python中使用public View onCreateView(...) { return inflater.inflate(R.layout.fragment_home, container, false); } 形式的导入工作需要什么?在2018年3.6?

当我查看像DjangoTensorflowTwisted这样的大型Python项目的随机模块时,这似乎是他们都使用的导入模式,可能是因为它有两个好处: a)明确对象的来源和b)保持对象的实际调用简洁。

我认为从这些项目中学习并尝试在我自己的软件包中模仿这种模式是错误的 - 而在我之前的其他人我已经遇到了循环导入的地狱。

值得庆幸的是,关于此主题的帖子已经很多了,他们的建议似乎分为两大类:

1)更改导入

许多建议都朝着使用其他形式的导入语法的方向发展。相当常见的是避免from package.module.submodule import SomeClass语句的方法,而只依赖于from X.Y import Z,然后在代码中使用import X.Y。长话短说,我试过这个,并以这种方式重写了我的整个包,并没有改变任何东西。对我来说,它看起来也非常单调和丑陋。

2)修复循环依赖

这是第二个建议系列,我完全同意,从一开始就采用好的设计完全避免这个问题。问题是我不知道如何做到这一点。

我的项目当然不是优秀软件设计的巅峰之作,但它也不是意大利面条代码。它是单个包中的十个模块(没有子模块),总共约1000行代码。每个模块都有一个职责:一个具有主要功能,一个是烧瓶实例,另一个是API客户端,另一个是所有数据模型,依此类推。对我而言,这些模块(不是类本身)之间的导入有时最终会变成循环似乎是不可避免的。我当然试图打破这些圈子(它们通常是四到五个模块),但是这总是导致其他圈子,如果不是立即,那么之后会有五个提交。

现在,我只是CS学生的第二年,而且我完全愿意接受这可能只是我还需要学习更多东西的一点。但首先,如果有人能够解释在上面提到的一些大型项目中如何处理这个问题,那将会非常有用。他们不应该一直遇到循环进口吗?他们如何阻止贡献者意外地在某个地方引入一个圈子?当他们发现导入不可能因为它会导致循环时,他们是否经常重构代码库?这里的一般方法是什么?

0 个答案:

没有答案