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
la deuxième méthode obtiendrait mon +1. Le premier est poisson et le troisième est ewww. – u0b34a0f6ae
Pourquoi '__import__' au lieu de' sys.modules [__ name __] '? –
@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