Django / Python:导入一次,随处使用

时间:2016-07-15 18:30:33

标签: python django python-import

我的views目录有以下结构。

views
|--__init__.py
|--a_management.py
|--b_management.py
|--c_management.py
|--d_management.py
|--e_management.py

__init__.py从以下内容开始:

from a_management import *
from b_management import *
from c_management import *
from d_management import *
from e_management import *
.........
...etc...
.........

在每个文件中{a_management.pyb_management.py ...)我需要编写相同的代码导入模块:

import sys,os
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
.........
...etc...
.........

是否可以仅在__init__.py执行所有模块导入?

当我尝试时,似乎仍未找到导入,我收到如下错误:NameError: global name 'sys' is not defined

2 个答案:

答案 0 :(得分:3)

如果每个management模块都需要访问sys,那么他们都必须导入它。没办法解决这个问题。 (而且,如果他们都需要它,那么他们所有应该导入它。这不是一件坏事。)

您可以通过__init__导入sysos以及需要其他任何内容来保存一些输入,然后每个management模块都可以执行{{1} },因此"继承"来自from __init__ import *的所有导入模块。

嗯,除非你不能这样做,因为__init__已经从__init__模块中导入了东西,所以上面的建议会导致循环导入,这是一个没有 - 号

我不知道您的应用程序的具体细节,但我必须相信有更好的方法来组织您的模块以避免重复导入,特别是使用{{1} }。通常你想尽可能少地使用它。

答案 1 :(得分:2)

使用共享脚本执行所有系统导入怎么样?

顺便说一句,我同意import *不是最好的主意。我使用导入程序是有道理的,但我不太确定你的常规设置。此外,您需要注意循环导入。

所以,我的回答是专门针对我需要编写相同的代码导入模块:,而不是针对整个设置是否有意义。

概念验证,导入程序是您真正关心的。:

├── pack
│   ├── __init__.py
│   ├── importer.py
│   ├── mgmt_1.py
│   ├── mgmt_2.py
└── test.py

<强> test.py

import pack
pack.foo_1()
pack.foo_2()

<强> init.py     来自mgmt_1 import *     来自mgmt_2 import *

<强> mgmt_1.py

from .importer import *

print "sys", sys
print "os", os

def foo_1():
    print "foo_1"

<强> mgmt_2.py:

from .importer import *

print "sys", sys
print "os", os

def foo_2():
    print "foo_2", dir(sys)[0:5]

<强> importer.py

import sys
import os

输出:

sys <module 'sys' (built-in)>
os <module 'os' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
sys <module 'sys' (built-in)>
os <module 'os' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
foo_1
foo_2:sys ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__']