【问题标题】:Import absolute import only once in Django project在 Django 项目中只导入一次绝对导入
【发布时间】:2015-01-05 01:38:06
【问题描述】:

我喜欢在 Python 2.7 中使用 absolute_import 函数。因为在 Python 2.7 中没有 absolute_import 所以我必须像这样导入它。

from __future__ import absolute_import

在我的 Django 项目中,我有很多文件,例如 models.py, views.py 等等。我必须在每个文件的顶部放置

from __future__ import absolute_import

能够使用此功能。

问题如下: 如果有可能在项目中只导入一次absolute_import 并在任何地方使用它?

【问题讨论】:

  • “只导入一次”到底是什么意思? Python 只导入一个模块一次,除非你明确地 reload() 它或使用其他一些花哨的导入函数。
  • 但是为什么每个包都需要它呢?在大多数情况下,您使用一种模式或另一种模式没有区别。仅当您有歧义时,这才有意义。
  • 我有 Django 项目,我想在每个文件中使用 absolute_import,例如项目中每个模块的 views.pyforms.py
  • 这是一个奇怪的问题。绝对导入 Python 2.7 的一部分——这个__future__ 导入应该只用于Python 2.6 或更低版本(参见PEP328)。您正在导入的符号absolute_import 是无用的(它甚至不是一个函数,它是一个类)。您实际上是否在使用 Python 2.6 并且想要 absolute_import 语义而不必在每个文件中显式“激活”它?你真的不能那样做,例如见stackoverflow.com/questions/13773861/…

标签: python django python-2.7


【解决方案1】:

频繁使用absolute_import 的问题通常是由包内的歧义引起的。如果你正在开发多个子包,并且需要不断地使用absolute_import来使用顶级包,只需将问题子包重命名即可。无论如何,这是个好主意。

【讨论】:

  • 很好,我完全不明白他在说什么
【解决方案2】:

可以重新定义__import__ built-in function,由import 语句调用。这可以用来模拟absolute_import 的行为。您需要在导入任何内容之前执行此操作

# This function will replace __builtin__.__import__.
# By default, the fifth argument (level) is not supplied.
# We use the value 0, which means absolute import.
def new_import(name, globals, locals, fromlist, level=0):
    # Call the original function.
    return orig_import(name, globals, locals, fromlist, level)

import __builtin__
# Save a reference to the original function.
orig_import = __builtin__.__import__
# Replace it with the new one.
__builtin__.__import__ = new_import

现在,程序中任何位置的所有import 语句都将调用此函数,这将使它们执行绝对导入,除非它们明确使用相对导入语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多