【问题标题】:Relative Imports相对进口
【发布时间】:2013-01-23 21:58:00
【问题描述】:

我正在阅读 Two Scoops Django Best Practices 以改进我的编码风格。我正在进行相对导入,这里是使其可重用的示例代码。

Old Way:
from cones.foo import bar

New way:
from .foo import bar

上面的代码是针对cones app的,如果我在其他app中调用其他模型怎么办?我必须这样写吗:

from .foo import bar
from .other import sample

OR

from .foo import bar
from test.other import sample

正确的方法是什么?

【问题讨论】:

  • 有一个合法的python模块叫做“test”——不要这样调用你的模块以避免混淆。

标签: django


【解决方案1】:

我通常只出于一个原因使用这样的导入

from .foo import bar
from .other import sample

原因是 如果明天,我的模块名称从“test”更改为“mytest”,那么代码不需要重构。该代码可以正常工作而不会中断。

更新

所有以“.”开头的导入点,仅适用于该包中。 跨包导入需要整个路径。

【讨论】:

  • 你是对的,这就是重构的原因,感谢您的信息
  • 你确定吗?因为这里说我可以放两个或多个点取决于其他应用程序中其他文件的位置
  • '.'和 '..' 被称为包内引用,这个名字说明了一切。仅适用于模块/包读取.. 阅读更多 [这里] (docs.python.org/2/tutorial/…)。子模块中给出的示例不是两个不同的模块
  • 好的,我现在明白了:)谢谢
  • 你的意思是它只在那个模块中有效?假设您还将模块称为简单的 .py 文件,那么为什么要导入当前模块中已经存在的函数(又名 .py 文件)。
【解决方案2】:

如果test 是另一个应用程序,

from .other import sample

不会工作。

更新:

您只能在从同一个应用导入时使用相对导入。

test 应用内

from .other import sample

会起作用。但是您仍然需要完整的表格

from cones.foo import bar

如果您从test 应用程序导入foo 中定义的方法。

所以用第二种方式回答你的问题是正确的方式。

【讨论】:

  • 如果我这样使用从...其他导入示例中调用其他文件夹怎么办?
  • 如果我忘记了文件的保存位置怎么办?有什么好的策略?
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2012-12-15
相关资源
最近更新 更多