2011-04-21 5 views
0

Je reçois un module en tant que paramètre et je voudrais récupérer toutes ses variables locales (rien qui se rapporte à XXX ou une fonction ou une classe).
Comment cela peut-il être fait?Comment récupérer toutes les variables locales d'un autre module?

J'ai essayé:

def _get_settings(self, module): 
     return [setting for setting in dir(module) if not inspect.ismodule(setting) and not inspect.isbuiltin(setting) and not inspect.isfunction(setting) and not setting.__NAME__.startswith('__')] 

mais il soulève:

Traceback (most recent call last): 
    File "/home/omer/Aptana Studio 3/plugins/org.python.pydev.debug_1.6.5.2011012519/pysrc/pydevd.py", line 1133, in <module> 
    debugger.run(setup['file'], None, None) 
    File "/home/omer/Aptana Studio 3/plugins/org.python.pydev.debug_1.6.5.2011012519/pysrc/pydevd.py", line 918, in run 
    execfile(file, globals, locals) #execute the script 
    File "/root/Aptana Studio 3 Workspace/website/website/manage.py", line 11, in <module> 
    import settings 
    File "/root/Aptana Studio 3 Workspace/website/website/settings.py", line 7, in <module> 
    settings_loader = Loader(localsettings) 
    File "/root/Aptana Studio 3 Workspace/website/website/envconf/loader.py", line 6, in __init__ 
    self.load(environment) 
    File "/root/Aptana Studio 3 Workspace/website/website/envconf/loader.py", line 9, in load 
    for setting in self._get_settings(module): 
    File "/root/Aptana Studio 3 Workspace/website/website/envconf/loader.py", line 16, in _get_settings 
    return [setting for setting in dir(module) if not inspect.ismodule(setting) and not inspect.isbuiltin(setting) and not inspect.isfunction(setting) and not setting.__NAME__.startswith('__')] 
AttributeError: 'str' object has no attribute '__NAME__' 
+1

Vous vouliez probablement dire '__name__', pas' __NAME__'. Python est sensible à la casse. – geoffspear

Répondre

2

Vous pouvez accéder à toutes les variables locales avec dir(). Cela retourne une liste de chaînes, où chaque chaîne est le nom de l'attribut. Cela retourne toutes les variables ainsi que les méthodes. Si vous êtes à la recherche spécifiquement pour que les variables d'exemple, ceux-ci sont accessibles à partir __dict__ par exemple:

>>> class Foo(object): 
...  def __init__(self, a, b, c): 
>>> 
>>> f = Foo(1,2,3) 
>>> f.__dict__ 
{'a': 1, 'c': 3, 'b': 2} 
>>> dir(f) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'c'] 
2

dir() retourne une liste de chaînes. Utilisez setting.startswith() directement.

Questions connexes