2010-08-27 3 views
1

J'essaie de créer une instruction d'importation qui est connectable avec d'autres projets. Cette déclaration se trouve dans urls.pyComment puis-je obtenir 'urlpatterns = __import __ (<string_name>)' pour fonctionner comme une instruction d'importation normale?

Alors cela fonctionne:

from forum.urls import urlpatterns 
# Base Class: <type 'list'> 

Mais cela ne fonctionne pas:

from settings import ROOT_URLCONF as project_urls 
urlpatterns = __import__(project_urls) 
# Base Class: <type 'module'> 

Comment puis-je obtenir ce dernier au travail?

Répondre

0
urlpatterns = __import__(project_urls).whateversubmodule.urlpatterns 
+0

urlpatterns = __import __ ('forum.urls'). Urls.urlpatterns a fonctionné parfaitement. – BryanWheelock

1

Vous souhaitez donc avoir des instructions d'importation relatives aux importations précédentes?

Certainement quelque chose que j'ai essayé à un moment donné. J'ai eu de très longues déclarations d'importation qui avaient une racine commune, alors j'ai essayé de l'éliminer. Je ne pouvais pas le faire fonctionner avec des instructions d'importation directes, mais peut-être que je n'ai pas essayé assez fort. Gardez à l'esprit que le comportement de l'instruction import par défaut va créer un objet module. Il le liera ensuite dans sys.modules, puis le liera dans l'espace de noms de votre module actuel avec le nom de l'instruction import. Voir http://docs.python.org/tutorial/modules.html.

Un objet de module a un espace de noms. Si un module n'est pas un package, son espace de nom provient de l'évaluation du contenu du fichier .py du module. Toutefois, s'il s'agit d'un package, l'espace de nom provient du module __init__.py du package. Les autres modules du package ne sont pas importés automatiquement et ne sont pas disponibles dans l'espace de noms du package. Vous devez les importer séparément.

L'instruction from ... import chargera le module dans sys.modules. Ensuite, il sortira l'objet de ce module auquel vous avez fait référence dans l'importation. Enfin, il lie cet objet dans l'espace de nom de votre module actuel avec le nom de l'instruction import. Fondamentalement, vous copiez une liaison d'un espace de noms à un autre. Pour être honnête, je trouve qu'il obscurcit généralement la source du nom lorsque vous l'utilisez plus tard (donc je ne le fais pas beaucoup).

Au point:

Votre utilisation de __import__ est un moyen de contourner les limites de la déclaration d'importation. Voir the python documentation. Toutefois, si vous utilisez une instruction from..import, n'essayez pas de réutiliser le nom obtenu dans __import__ sauf si cela pointe vers un objet module (ce qui n'est probablement pas le cas). Les importations nécessitent uniquement une séquence de noms de modules délimitée par des points. De plus, gardez à l'esprit que le simple fait d'importer explicitement peut être un moyen plus simple d'indiquer d'où vient un objet.

+0

Belle réponse détaillée. Je ne savais pas comment procéder cependant. Je t'ai mis à jour. – BryanWheelock

Questions connexes