2012-12-11 7 views
0

Dites que j'ai un paquet "colorExtentions" et dans mon __init__.py j'ai __all__=["red", "blue"]. Ce paquet devrait pouvoir être étendu automatiquement en ajoutant des modules au répertoire et à la liste __all__. Est-ce que ce qui suit est acceptable ou existe-t-il une autre «meilleure pratique» pour ce genre de choses?python liste tous les modules importés importés via *, la façon pythonique

import colorExtentions 
from colorExtentions import * 

for moduleName in colorExtentions.__all__: 
    colors.append(moduleName) 
promptUserToChoose(colors) 
+0

Que sont exactement «rouge» et «bleu» ici? Des classes? Modules? –

+0

ce sont des modules mais j'appelle explicitement la classe dans mon '__init __. Py' avec' from red import Red'. – Psyclops

+0

automatiquement et ajouter manuellement dans __all__, ressemble à une blague. – Denis

Répondre

3

Présumant que chaque couleur est une classe, je dirais la solution agréable serait d'assurer que toutes vos couleurs sous-classe à partir d'une seule classe (ce qui est une bonne conception de toute façon):

class Color: 
    ... 

Ensuite, lorsque vous voulez une liste de toutes les couleurs, vous pouvez simplement importer des modules qui contiennent les classes, et à faire:

from colorExtentions import * 

colors = Color.__subclasses__() 

de cette façon, vous vous retrouvez avec une liste de chaque Color sous-classe.

Remarquez dans 2.x, vous aurez besoin de classes de style nouveau (héritant de object) pour que la méthode __subclasses__() soit disponible.

+0

+1 Comme celui-là! –

+0

+1 j'aime aussi ça ... mais dans mon cas, cela signifie que pour ajouter une nouvelle couleur, quelqu'un doit * éditer * le fichier par opposition à * ajouter * le fichier. – Psyclops

+0

@Psyclops Pourquoi? Ils ajoutent simplement un module avec une classe ou ajoutent une classe à un module existant. –

0

L'importation de tous les noms de modules est déconseillée dans la documentation officielle de Python. Voir:

http://docs.python.org/2/howto/doanddont.html#from-module-import

Quote:

Quand il est très bien

Il y a des situations où de * l'importation du module est très bien:

  • L'invite interactive . Par exemple, à partir de l'import de maths, Python est une calculatrice scientifique incroyable.
  • Lors de l'extension d'un module en C avec un module> en Python.
  • Lorsque le module annonce lui-même à partir de import * safe.

Si vous insistez d'utiliser __all__ - utiliser un autre nom, comme color_list, et d'étendre cette variable dynamique. Ensuite, importer cette variable:

import colorExtentions 
from colorExtentions import color_list 

colors.extends(color_list) 
+1

L'utilisation de '__all__' est l'une des façons dont un module" se présente lui-même comme import * safe ". –

+0

Modifié la liste pour être un peu plus lisible. –

+0

mais comment puis-je implémenter un chargeur d'extension dynamique? – Psyclops

Questions connexes