2016-07-15 9 views
6

views dizinim için aşağıdaki yapıya sahibim.Django/Python: Bir kere içe aktar, her yerde kullanın

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

ve aşağıdaki __init__.py başlar: dosyaların her birinde

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 ...) Ben modülleri ithal aynı kod yazmak gerekir:

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

Tüm modül ithalatlarını yalnızca __init__.py'da gerçekleştirmek mümkün mü? Her management modül sys erişmesi gerekiyorsa NameError: global name 'sys' is not defined

+0

Yapım seçiminizle çok karıştım. Neden hepsini __init __. Py'de içe aktarıyorsunuz? – IanAuld

+0

@IanAuld bu [SI cevap] (http://stackoverflow.com/a/1921911) – Jedi

+0

bölme görünümüdür işlevleri/yöntemleri views.py' 'bölmek için aşağıdaki ediyorum gayet iyi. Ancak, başka bir yerde kullanmak için bir görünümün içe aktarılması, 'urls.py' adresiniz olmadığı sürece biraz gariptir. tüm görüşleri sadece init ekleme o kadar içe SomeView' yerine 'ait view.a_management ithalat SomeView' gelen görünümlerinden' kullanmak yapar. Bir paket oluşturmak için aslında '__init __. Py' öğesine herhangi bir şey eklemeniz gerekmez. – IanAuld

cevap

2

Tüm sistem ithalatlarını yapmak için paylaşılan bir komut dosyası kullanma hakkında ne düşünüyorsunuz?

BTW, import *'un en büyük fikir olmadığını kabul ediyorum. ithalatçı kullanımımda anlamlıdır, ancak genel kurulumunuzda bu kadar emin değilim. Ayrıca, dairesel ithalat konusunda da dikkatli olmalısınız.

Bu yüzden, cevabım özellikle yalnızca 'a yöneliktir. Aynı kod içe aktarma modüllerini yazmam gerekiyor:, kurulumunuzun bir bütün olarak mantıklı olup olmadığına bağlı değil. kavramının

Kanıtı, ithalatçı gerçekten dan mgmt_1 ithalat * den init.py yaklaşık .:

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

test.py

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

bakım nedir 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 

çıkışı:

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

, sonra hepsi içe gerekir: Denedim

, hala ithalatı buldum ve benzeri hatalar olsun değil gibi görünüyor. Bunun bir yolu yok. (Ve gerçekten, hepsi çok ihtiyaç olursa, o zaman hepsi gerektiği ithalat o. Kötü bir şey değil.)

Başka whtever tabi __init__ ithalat sys, os alarak yazarak biraz kaydedip olabilir, ve daha sonra her bir management modülü from __init__ import * yapabilir, böylece tüm içe aktarılan modülleri __init__'dan "devralıyor".

Eh, ancak bu şekilde yapamazsınız, çünkü __init__ zaten management modüllerinden öğeleri alır, bu nedenle yukarıdaki öneriyi no-no olan döngüsel içe aktarmalarla sonuçlanır.

Uygulamanızın özelliklerini bilmiyorum, ancak çok fazla yinelenen içe aktarmayı ve özellikle import *'un çok fazla kullanılmasını önlemek için modüllerinizi düzenlemenin daha iyi bir yolu olduğuna inanıyorum. Genel olarak bunu mümkün olduğunca az kullanmak istersiniz.

+0

Ben 'common_imports * içe gelen' bir 'common_imports.py' oluşturabilir ve sonra kullanabilirsiniz benziyor için – Jedi

+1

Kesinlikle bunu yapma, ben bile o bir anti-kalıptır söyleyecek kadar ileri gider. İçe aktarımlarınız, başka bir dosyada süzüldüklerinde kullanılan dosyaların üstünde olmalıdır. Görüşlerin hepsi aynı modülleri içe aktarıyorsa, yinelenen kodları paylaşılan işlevlere atabilirseniz düşünün. Yeni bir dosya oluşturun, orada tekrarlanan kodu küçük fonksiyonlara taşıyın, tekrarlanan ithalatlarınızı yapın ve sadece ihtiyacınız olan fonksiyonları içe aktarın. – IanAuld

+0

Tamam ... bu mantıklı ... ianAuld. JSIK, bu neden çattı? – Jedi

İlgili konular