2009-06-21 7 views
2

Donc je viens de rencontrer un étrange bug. Parce que cela fonctionne sur mes autres fichiers .py, mais seulement sur ce fichier, il a soudainement cessé de fonctionner.Pourquoi l'importation en masse ne fonctionne-t-elle pas mais l'importation de la définition fonctionne-t-elle individuellement?

from tuttobelo.management.models import * 

Ce qui précède a l'habitude de fonctionner, mais il a cessé de fonctionner tout à coup, et j'ai dû le remplacer par le fond.

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

Je sais que ce qui suit est la meilleure façon de codage, mais tous les modèles mentionnés dans les modèles sont utilisés, donc ma question est, quelles sont les raisons possibles peuvent cesser de travailler wildcard? L'erreur que j'ai eu, c'est que le modèle que j'essayais d'importer n'existe pas, seulement si je supprime le caractère générique et que j'importe le nom du modèle, puis-je l'importer correctement.

Merci!

+0

Que signifie "tout d'un coup"? Qu'avez-vous changé entre le moment où cela a fonctionné et cessé de travailler? Pouvez-vous poster un résumé de vos modèles? Clairement, vous avez changé quelque chose qui a cassé l'importation. –

Répondre

4

Peut-être que le module models a un __all__ qui n'inclut pas ce que vous cherchez. Quoi qu'il en soit, from ... import * est jamais une bonne idée dans le code de production - nous avons toujours voulu dire la fonctionnalité import * pour une utilisation exploratoire interactive, pas l'utilisation de la production. Plus précisément, importez le module dont vous avez besoin - utilisez ce nom pour qualifier les noms qui y appartiennent - et vous serez beaucoup plus heureux à long terme! -)

+0

Et si j'ai 100 noms à importer? Thing is import * fonctionne sur d'autres fichiers py mais pas sur ce fichier. Merci pour votre entrée tho;) – nubela

+0

import * est BAD, ne l'utilisez pas. Au lieu de cela, utilisez 'import tuttobelo.management.models comme tmm; tmm.ProductMeta ... '.Corrigez votre code, et le problème sera résolu aussi. – SpliFF

+0

Vous n'aurez pas - en pratique - 100 noms à importer. Ce genre de modèle est mauvais. –

1

Il existe des cas en Python où l'importation avec * ne donnera pas n'importe quoi. Dans votre exemple, si tuttobelo.management.models est un paquet (c'est-à-dire un répertoire avec __init__.py) avec les fichiers Preferences.py, ProductVariant.py, etc, l'importation avec star ne fonctionnera pas, sauf si vous l'avez déjà importé explicitement ailleurs.

Ceci peut être résolu en mettant en __init__.py:

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

Cela permettra de faire à nouveau l'importation *, mais comme il est indiqué, c'est un style de codage horrible pour plusieurs raisons. Un, des outils comme pyflakes et pylint, et introspection de code dans votre éditeur, arrête de fonctionner. Deuxièmement, vous finissez par mettre beaucoup de noms dans l'espace de noms local, qui dans votre code vous ne savez pas d'où ils viennent, et d'autre part vous pouvez obtenir des conflits dans des noms comme celui-ci.

Une meilleure façon est de faire

from tuttobelo.management import models 

Et puis reportez-vous aux autres par models.Preferences, models.ProductVariant etc. Cependant, cela ne fonctionnera pas avec la variable __all__. Au lieu de cela, vous devez importer les modules du __init__.py:

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

L'inconvénient est que tous les modules importés se même si vous ne les utilisez pas, ce qui signifie qu'il faudra plus de mémoire.

Questions connexes