2009-06-21 1 views
2

Итак, я просто встретил странную так называемую ошибку. Поскольку это работает на других моих файлах .py, но только в этом файле он внезапно перестает работать.Почему массовый импорт не работает, но импортное определение индивидуально работает?

from tuttobelo.management.models import * 

Вышеприведенный ранее работавший, но он внезапно прекратил работу, и мне пришлось заменить его на дно.

from tuttobelo.management.models import Preferences, ProductVariant, UserSeller, ProductOwner, ProductModel, ProductVariant 
from tuttobelo.management.models import ProductMeta, ShippingMethods 

Я знаю следующее лучший способ кодирования, однако все модели, упомянутые в модели используются, поэтому мой вопрос, каковы возможные причины могут перестать работать символы подстановки?

Ошибка, которую я получил, заключалась в том, что модель, которую я пыталась импортировать, не существует, только если я удалю шаблон и импортирую имя модели, могу ли я импортировать его правильно.

Спасибо!

+0

Что означает «внезапно»? Что вы изменили, когда работали и перестали работать? Можете ли вы опубликовать резюме своих моделей? Очевидно, вы изменили что-то, что нарушило импорт. –

ответ

4

Возможно, модуль models имеет __all__, который не включает в себя то, что вы ищете. Во всяком случае, from ... import * является никогда хорошая идея в производственном кодексе - мы всегда имели в виду функцию import * для интерактивного поискового использования, не производство использование. В частности, импортируйте требуемый модуль - используйте это имя, чтобы квалифицировать имена, которые там находятся, - и вы будете намного счастливее в долгосрочной перспективе!)

+0

Что делать, если мне нужно импортировать 100 имен? Thing is import * работает с другими файлами py только в этом файле. Спасибо за ваш вход tho;) – nubela

+0

import * is BAD, не используйте его. Вместо этого используйте 'import tuttobelo.management.models как tmm; tmm.ProductMeta ... '.Исправьте свой код, и проблема также будет исправлена. – SpliFF

+0

Вы не будете - как практический вопрос - имеете 100 имен для импорта. Такая модель плоха. –

1

В Python есть некоторые случаи, когда импорт с * не даст что-нибудь. В вашем примере, если tuttobelo.management.models - это пакет (то есть каталог с __init__.py) с файлами Preferences.py, ProductVariant.py и т. Д., Импорт со звездой не будет работать, если вы уже не импортировали его явно где-нибудь еще.

Эту проблему можно решить, поставив в __init__.py:

__all__ = ['Preferences', 'ProductVariant', 'UserSeller', <etc...> ] 

Это позволит сделать импорт * еще раз, но, как уже отмечалось, что это ужасный стиль кодирования по нескольким причинам. Во-первых, инструменты, такие как pyflakes и pylint, и интроспекция кода в вашем редакторе перестают работать. Во-вторых, вы вставляете много имен в локальное пространство имен, которые в вашем коде вы не знаете, откуда они пришли, а во-вторых, вы можете столкнуться с именами вроде этого.

Лучший способ это сделать

from tuttobelo.management import models 

А затем обратиться к другим вещам по models.Preferences, models.ProductVariant и т.д. Это, однако, не будет работать с переменной __all__. Вместо этого вам необходимо импортировать модули из __init__.py:

import Preferences, ProductVariant, UserSeller, ProductOwner, <etc...> 

Недостатком этого является то, что все модули импортируются, даже если вы не используете их, что означает, что он будет занимать больше памяти.