2012-04-18 35 views
9

मैं एप्लिकेशन direcroty पर स्थित एक utils.py पर इस funcion लिखा है:आयात संबंधी त्रुटि models.py

from bm.bmApp.models import Client 

def get_client(user): 
    try: 
     client = Client.objects.get(username=user.username) 
    except Client.DoesNotExist: 
     print "User Does not Exist" 
     return None 
    else:  
     return client 

def to_safe_uppercase(string): 
    if string is None: 
     return '' 
    return string.upper() 

फिर जब मैं अपने models.py फ़ाइल पर समारोह to_safe_uppercase उपयोग करते हैं, में यह आयात करके इस तरह से:

from bm.bmApp.utils import to_safe_uppercase 

मैं अजगर त्रुटि मिली:

 from bm.bmApp.utils import to_safe_uppercase 
ImportError: cannot import name to_safe_uppercase 

मैं इस समस्या के लिए समाधान हो गया, जब मैं टी बदल वह के लिए बयान आयात:

from bm.bmApp.utils import * 

लेकिन मैं नहीं समझ सकता क्यों यह, क्यों जब मैं विशेष समारोह मैं त्रुटि मिली आयात किया जाता है?

+0

ऐसा नहीं होना चाहिए। मुझे संदेह है कि कुछ और चल रहा है।दुर्भाग्यवश – Marcin

+0

दुर्भाग्य से, django डिफ़ॉल्ट रूप से आयात करता है और इन errormessage के साथ उन्हें बदल देता है। django पैच करने की कोशिश करें, ताकि यह आपको ट्रेसबैक देता है, इससे समस्या को इंगित करना चाहिए। मुझे चक्रीय आयात या ऐसा कुछ संदेह है। – ch3ka

+0

@ ch3ka पैचिंग django एक अच्छा विचार नहीं है ... वह भी पहले से ही पाइथन ट्रेसबैक हो रहा है। उन्होंने – Jiaaro

उत्तर

0

मुझे यकीन नहीं है कि मैं आयात त्रुटि समझा सकता हूं, लेकिन मेरे पास तीन विचार हैं। सबसे पहले, आपके फ़ंक्शन को ट्वीविंग की आवश्यकता है। आपने एक तर्क के रूप में एक आरक्षित शब्द 'स्ट्रिंग' का उपयोग किया है। नामकरण पर विचार करें।

दूसरा, यदि आप ./manage.py खोल का आह्वान करते हैं तो क्या होता है, और हाथ से आयात करें। क्या यह आपको कोई अलग देता है?

तीसरा, अजगर कोड पुन: संयोजित करने के लिए Django मजबूर करने के लिए अपने pyc फ़ाइलों को हटाने की कोशिश (यह एक एक बहुत लंबे शॉट है ... लेकिन लायक नष्ट करने)

+0

मैंने सोचा कि यह 'str' – Jiaaro

+0

था यह str है। लेकिन स्ट्रिंग stdlib में एक मॉड्यूल है ... – ch3ka

7

आप एक परिपत्र आयात बना रहे हैं।

utils.py 
from bm.bmApp.models import Client 
# Rest of the file... 

models.py 
from bm.bmApp.utils import to_safe_uppercase 
# Rest of the file... 

मैं अपने कोड को अपने refactor सुझाव है, ताकि आप एक सर्कुलर निर्भरता की जरूरत नहीं है (अर्थात utils models.py या ठीक इसके विपरीत आयात करने की आवश्यकता नहीं होना चाहिए)।

+0

ओपी तब से क्यों काम करता है जब ओपी 'आयात *' का उपयोग करता है? – jadkik94

+0

देखें http://docs.python.org/faq/programming.html#what-are-the-best-practices-for-using-import-in-a- मॉड्यूल –

+0

धन्यवाद। आपको अपने उत्तर में इसके बारे में कुछ जोड़ने पर विचार करना चाहिए, यह ओपी के सवाल का हिस्सा है। :) – jadkik94

10

आप परिपत्र आयात के रूप में जाना जाता है।

models.py:

from bm.bmApp.utils import to_safe_uppercase 

utils.py:

from bm.bmApp.models import Client 

अब जब आप import bm.bmApp.models कर दुभाषिया निम्नलिखित है:

  1. models.py - Line 1: bm.bmApp.utils
  2. आयात करने का प्रयास
  3. utils.py - Line 1: आयात करने का प्रयास bm.bmApp.utils
  4. utils.py - Line 1: bm.bmApp.models
  5. models.py - Line 1 आयात करने की कोशिश आयात करने का प्रयास bm.bmApp.models
  6. ...

सबसे आसान समाधान समारोह अंदर आयात स्थानांतरित करने के लिए है:

utils.py:

def get_client(user): 
    from bm.bmApp.models import Client 
    try: 
     client = Client.objects.get(username=user.username) 
    except Client.DoesNotExist: 
     print "User Does not Exist" 
     return None 
    else:  
     return client 

def to_safe_uppercase(string): 
    if string is None: 
     return '' 
    return string.upper() 
संबंधित मुद्दे