Lors de l'exécution, le code Python obtient le nom d'un sous-module à charger, que je ne connaissais pas auparavant. Maintenant, je veux vérifier, si ce sous-module existe à l'intérieur d'un module existant. Considérez cette structure, où foo
et bar
peut préciser:Comment vérifier les sous-modules en Python avec hasattr
master/
|
|- __init__.py
|
|- foo/
| |
| |- __init__.py
|
|- bar/
|
|- __init__.py
Maintenant, d'habitude je le fais, qui travaille pour defs et variables:
import master
unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
pass # all's well
ou je suis attrapant le AttributeError, qui fonctionne également.
Cependant, avec la structure de fichier ci-dessus, je ne suis pas capable de mettre cette approche en place et de travailler. hasattr()
renvoie toujours False (c'est-à-dire qu'il y a toujours un attribut AttributeError).
Si je regarde dir(master)
, je vois cette sortie:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
et même en spécifiant explicitement __all__
dans master/__init__.py
ne vous aide pas, mais change le répertoire() pour
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
Toute idée , ce que je fais mal, ou s'il y a un moyen de réaliser ce genre de tests? (BTW: Python 2.6 sur Win/Cygwin, si c'est de tout intérêt)
Que voulez-vous dire par «déclaré explicitement»? Je pensais que c'était pour ça? Avez-vous un pointeur à portée de main pour une explication utile? (Autre que http://docs.python.org/tutorial/modules.html ou http://effbot.org/zone/import-confusion.htm) En dehors de cela, oui le '__import __()' fait ce qui est demandé. – Boldewyn
Non, '__all__' détermine ce qui est importé quand vous dites' from ... import * '. Mais ce n'est pas lié à votre problème. Si vous avez un module 'A' et un module' A.B', l'importation de 'A' n'apporte pas magiquement un membre' B' à 'A'-seulement si' A' importe lui-même 'A.B'. Pour accéder à 'A.B', vous devez importer' A.B', pas 'A'. Dans le cas de 'os.path', l'importation de' os' fonctionne parce que 'os' importe activement' os.path'. – Philipp
Merci pour l'explication! Je pense que je commence à avoir une emprise sur ce sujet. – Boldewyn