2009-08-23 66 views
4

我正在开发一个Python应用程序;它的所有代码都放在一个包里面,当然在里面运行。应用程序的Python包对于用户来说是口译员不感兴趣的,它只是一个GUI应用程序。我应该使用“从包导入使用情况,设置”或“从。导入使用情况,设置”

的问题是,其风格是优选的,应用程序包内导入模块时

from application import settings, utils 

from . import settings, utils 

也就是说,因为它是(此处“应用”我可以指定的名称)或者我可以用“。”来表示“当前包”。

这是一个免费的软件包,所以有人想让我的应用程序分叉并更改它的名字。在这种情况下,替代方案1是一种轻微的麻烦。尽管如此,我始终使用样式1(尽管早期代码在某些地方使用样式2),因为样式1看起来好多了。

是否有我的风格(1)我错过了任何论点?或者不喜欢风格2,这太愚蠢了吗?

回答

10

Python Style Guide建议明确对相对进口(风格):

的封装内进口相对进口高度气馁。 始终对所有导入使用绝对包路径。 即使现在PEP 328 [7]已经在Python 2.5, 中完全实现,其显式相对导入的风格也被阻止; 绝对导入更便携,通常更具可读性。

我倾向于同意。相对导入意味着相同的模块在不同的文件中以不同的方式导入,并且要求我记住阅读和编写时所看到的内容。不值得,可以用sed进行重命名。

除了重命名的问题,绝对导入的唯一问题是import foo可能意味着当前模块下面的顶级模块foo或子模块foo。如果这是一个问题,您可以使用from __future__ import absolute_import;这在Python 3中是标准的。

+0

我对绝对/相对感到困惑。我的意思是,没有两种风格,有三种:import utils,来自。导入使用情况,以及从应用程序导入使用情况。我想到了这种情况“。”这里实际上是一个绝对导入,与“import x”情况相反。因此,我在平等的位置上述1和2。确实,对于更深的应用(我的只有一个包和一个子包),有很多地方可以调用“。” – u0b34a0f6ae 2009-08-23 10:39:38

+1

该应用程序的早期问题是,因为我有一个名为“application.application”的模块,cPickle将无法工作,但pickle会(不同的abs/rel导入处理)。我必须通过重命名模块来解决问题,无论如何这是一个糟糕的名字。 – u0b34a0f6ae 2009-08-23 10:48:33