Почему массовый импорт не работает, а импорт определений работает отдельно? - PullRequest
2 голосов
/ 21 июня 2009

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

from tuttobelo.management.models import *

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

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

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

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 июня 2009

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

1 голос
/ 21 июня 2009

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

Это можно решить, введя __init__.py:

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

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

Лучше сделать

from tuttobelo.management import models

А затем обратитесь к другим вещам по моделям. Предпочтения, модели. Вариант продукта и т. Д. Однако это не будет работать с переменной __all__. Вместо этого вам нужно импортировать модули из __init__.py:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...