2016-07-15 13 views
6

Tôi có cấu trúc sau cho thư mục views của mình.Django/Python: Nhập một lần, sử dụng ở mọi nơi

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

__init__.py bắt đầu với những điều sau đây:

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

Trong mỗi file (a_management.py, b_management.py ...) Tôi cần phải viết mã tương tự nhập khẩu các module:

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

Có thể thực hiện tất cả các mô-đun nhập chỉ trong __init__.py?

Khi tôi cố gắng, nó vẫn có vẻ như hàng nhập khẩu không được tìm thấy và tôi nhận được lỗi như: NameError: global name 'sys' is not defined

+0

Tôi rất bối rối bởi sự lựa chọn cấu trúc của bạn. Tại sao bạn nhập tất cả của bạn trong '__init __. Py', bạn đang sử dụng chúng ở đâu khác? – IanAuld

+0

@IanAuld Tôi đang theo dõi [SO trả lời] này (http://stackoverflow.com/a/1921911) để chia nhỏ 'views.py' – Jedi

+0

Tách các chức năng/phương thức chia tách là tốt. Tuy nhiên, việc nhập chế độ xem để sử dụng ở nơi khác thì hơi khác thường trừ khi địa điểm đó là 'urls.py' của bạn. Thêm tất cả các khung nhìn của bạn vào init chỉ làm cho nó để bạn sử dụng 'từ các khung nhìn import SomeView' thay vì' từ view.a_management import SomeView'. Bạn không cần phải thêm bất cứ thứ gì vào '__init __. Py' để tạo một gói. – IanAuld

Trả lời

2

Điều gì về việc sử dụng tập lệnh được chia sẻ để thực hiện tất cả các lần nhập hệ thống?

BTW, tôi đồng ý rằng import * không phải là ý tưởng lớn nhất. Điều đó có ý nghĩa khi tôi sử dụng nhà nhập khẩu, nhưng tôi không chắc chắn trong thiết lập chung của bạn. Ngoài ra, bạn cần phải cẩn thận về nhập khẩu vòng tròn.

Vì vậy, câu trả lời của tôi đặc biệt chỉ hướng đến Tôi cần phải viết cùng một mô-đun nhập mã:, không hướng tới việc thiết lập của bạn nói chung có hợp lý hay không.

Bằng chứng về khái niệm, nhập khẩu là những gì bạn thực sự quan tâm .:

├── 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 từ mgmt_1 nhập khẩu * từ nhập khẩu 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 

đầu ra:

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__'] 
3

Nếu mỗi module management cần truy cập vào sys, sau đó tất cả họ đều phải nhập nó. Không có cách nào xung quanh đó. (Và thực sự, nếu tất cả họ đều cần đến nó, sau đó tất cả họ đều nên nhập khẩu nó. Nó không phải là một điều xấu.)

Bạn có thể tiết kiệm một chút gõ bằng cách __init__ nhập khẩu sys, os và whtever khác là cần thiết, và sau đó mỗi mô-đun management có thể làm from __init__ import *, do đó "kế thừa" tất cả các mô-đun đã nhập từ __init__. Vâng, ngoại trừ bạn không thể làm theo cách này, bởi vì __init__ đã nhập nội dung từ các mô-đun management, do đó, đề xuất ở trên sẽ dẫn đến nhập khẩu vòng tròn, không có.

Tôi không biết chi tiết về đơn đăng ký của bạn, nhưng tôi phải tin rằng có cách tốt hơn để tổ chức mô-đun của bạn để tránh nhập nhiều lần, và đặc biệt là sử dụng nhiều import *. Nói chung bạn muốn sử dụng nó càng ít càng tốt.

+0

Nghe như tôi có thể tạo một 'common_imports.py' và sau đó sử dụng' từ common_imports import * '? EDIT: Điều đó hoạt động !! – Jedi

+1

Chắc chắn không làm điều đó, tôi thậm chí sẽ đi xa như nói rằng đó là một mô hình chống. Hàng nhập của bạn phải ở trên cùng của tệp mà chúng được sử dụng mà không được tìm thấy trong một số tệp khác. Nếu tất cả các chế độ xem của bạn đều nhập cùng một mô-đun, hãy nghĩ rằng nếu bạn có thể tóm tắt một số mã lặp lại trong các hàm được chia sẻ. Tạo một tệp mới, di chuyển mã lặp lại ở đó đến các hàm nhỏ hơn, thực hiện nhập khẩu lặp lại của bạn ở đó và sau đó chỉ nhập các hàm bạn cần. – IanAuld

+0

Được rồi ... có ý nghĩa ... @IanAuld. JSIK, tại sao cái này lại cau mày? – Jedi

Các vấn đề liên quan