Django/Python:一次导入,到处使用
Django/Python: Import once, use everywhere
我的 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.py
、b_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
如果每个 management
模块都需要访问 sys
,那么它们都必须导入它。没有办法解决这个问题。 (实际上,如果他们都需要它,那么他们都应该导入它。这不是一件坏事。)
您可以通过 __init__
导入 sys
、os
和其他任何需要的东西来节省一些输入,然后每个 management
模块可以做 from __init__ import *
,因此 "inheriting" 来自 __init__
的所有导入模块。
好吧,除非你不能这样做,因为 __init__
已经从 management
模块导入了东西,所以上面的建议会导致循环导入,这是一个 no-没有。
我不知道您的应用程序的具体情况,但我必须相信有更好的方法来组织您的模块以避免如此多的重复导入,尤其是如此多地使用 import *
。通常,您希望尽可能少地使用它。
使用共享脚本执行所有系统导入怎么样?
顺便说一句,我同意 import *
不是最好的主意。这在我使用 importer 时很有意义,但我不太确定您的一般设置。此外,您需要注意循环导入。
所以,我的回答专门针对我需要编写相同的代码导入模块:,而不是针对您的设置作为一个整体是否有意义。
概念验证,importer 才是您真正关心的。:
├── 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 导入 *
来自 mgmt_2 导入 *
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__']
我的 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.py
、b_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
如果每个 management
模块都需要访问 sys
,那么它们都必须导入它。没有办法解决这个问题。 (实际上,如果他们都需要它,那么他们都应该导入它。这不是一件坏事。)
您可以通过 __init__
导入 sys
、os
和其他任何需要的东西来节省一些输入,然后每个 management
模块可以做 from __init__ import *
,因此 "inheriting" 来自 __init__
的所有导入模块。
好吧,除非你不能这样做,因为 __init__
已经从 management
模块导入了东西,所以上面的建议会导致循环导入,这是一个 no-没有。
我不知道您的应用程序的具体情况,但我必须相信有更好的方法来组织您的模块以避免如此多的重复导入,尤其是如此多地使用 import *
。通常,您希望尽可能少地使用它。
使用共享脚本执行所有系统导入怎么样?
顺便说一句,我同意 import *
不是最好的主意。这在我使用 importer 时很有意义,但我不太确定您的一般设置。此外,您需要注意循环导入。
所以,我的回答专门针对我需要编写相同的代码导入模块:,而不是针对您的设置作为一个整体是否有意义。
概念验证,importer 才是您真正关心的。:
├── 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 导入 * 来自 mgmt_2 导入 *
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__']