2009-11-22 5 views
1

J'ai un module python.Remplissage des valeurs dans l'espace de nom du module

Je veux remplir certaines valeurs à l'exécution, comment le faire.

Par exemple. J'ai une liste,

[ « A », « B », « C »]

Je crée là des cours avec ces noms, et les veux disponibles comme si je les ai créés normalement

for el in ['A', 'B', 'C']: 
    type(el, (object,), {}) 

Répondre

5

Je peux penser à deux manières de le faire ... Pour de (ce que je crois être) meilleur au pire, nous avons:

D'abord, la définition des attributs sur le module actuel

# The first way I had of grabbing the module: 
mod = __import__(__name__, fromlist=['nonempty']) 

# From Roger's suggestion: 
import sys 
mod = sys.modules[__name__] 

for name in ['A', 'B', 'C']: 
    class_ = type(name, (object,), {}) 
    setattr(mod, name, class_) 

print A, B, C 

en second lieu, la mise dans le dict gLOBALS actuel:

for name in ['A', 'B', 'C']: 
    class_ = type(name, (object,), {}) 
    globals()[name] = class_ 

print A, B, C 

dernier, en utilisant exec (beurk):

for name in ['A', 'B', 'C']: 
    class_ = type(name, (object,), {}) 
    exec "%s = class_" % name 

print A, B, C 

J'ai testé tous ces trois travaux dans un script autonome (où __name__ == "__main__") et comme un module dans un paquet plus grand. En ce qui concerne la discussion de la méthode 1 par rapport à la méthode 2 dans les commentaires, ils font EXACTEMENT la même chose. L'espace de nom d'un module est défini dans un dict stocké sur le module (here are the docs). Au niveau du module, vous pouvez l'obtenir via globals() et de l'extérieur, vous pouvez y accéder via des attributs, ou l'attribut __dict__ du module.

Une session interactive pour démontrer:

Python 2.6.4 (r264:75706, Nov 8 2009, 17:35:59) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> mod = sys.modules[__name__] 
>>> mod.__dict__ is globals() 
True 
+1

la deuxième méthode obtiendrait mon +1. Le premier est poisson et le troisième est ewww. – u0b34a0f6ae

+2

Pourquoi '__import__' au lieu de' sys.modules [__ name __] '? –

+0

@kaizer: Le premier est ce que l'OP veut: les classes doivent être ajoutées aux attributs du module (et à partir du module, qui fonctionne toujours dans ce cas), pas dans les globales. Il semble que '__import__' a toujours son utilité. Je pense que nous sommes tous d'accord sur la partie ewww ;-) – RedGlyph

2

Pour créer vos classes dynamiquement et les rendre disponibles dans le module mymodule:

import mymodule 
for el in ['A', 'B', 'C']: 
    setattr(mymodule, el, type(el, (object,), {})) 

Pour créer les classes dans le module actuel, utilisez l'approche Mike's answer.

+0

Mais comment voulez-vous faire de l'intérieur 'mymodule'? – agiliq

+0

Jetez un coup d'œil à la réponse de Mike: toutes les approches suggérées devraient bien fonctionner. –