2010-02-28 5 views
0

Je ne comprends pas dans quel environnement une instruction eval ou exec s'exécute. Vous pouvez leur passer des étendues globales et locales, mais je ne comprends pas très bien ce que cela signifie. Python crée-t-il pour eux un module anonyme, et si tel est le cas, en quoi la portée globale et locale est-elle différente?Environnement d'exécution Python Eval

L'exécute-t-il comme s'il s'agissait d'une fonction anonyme? Si c'était le cas, les étendues globales et locales auraient plus de sens pour moi, bien que vous deviez encore appeler global var pour empêcher python de faire une variable locale sur l'affectation?

Et voici un code pour montrer ce que je suis en train de faire.

# module level vars 
result = '' 

allowed_builtins = {"__builtins__":{'int':int, 'str':str, 'range':range, 'dir':dir, 
            'zip':zip 
}, 
        "result":result} 

En classe

def _exec(self, answer, function_name, input): 
    global result 
    exec_string = answer + '\n' 
    exec_string += 'global result; result = %s(%s)' % (function_name, input) 
    exec exec_string in allowed_builtins, {} 

    return result 

je voudrais le résultat var dans mon champ pour pouvoir être mis à l'intérieur du périmètre du eval/exec.

QUESTION POSÉE !!!!!!!!!

Répondre

2

Le dictionnaire "local" est l'endroit où tous les noms sont définis au cours d'un exec ou eval; le terme "global" est utilisé pour rechercher les noms qui ne figurent pas dans le nom "local", mais les noms ne sont pas définis à moins que vous ne soyez exec code contenant une instruction global.

Aucun objet module est créé intrinsèquement soit par eval ou exec, ni aucun objet de fonction, anonyme ou autre (encore une fois, bien sûr: à moins que vous exec des déclarations telles que def, etc.).

Modifier: par exemple, étant donné le code OP, et en supposant _exec est une fonction autonome, car de l'OP donnant pas class où il pourrait vivre, ajouter à la fin:

print 'one: %r' % _exec(None, '"foo"', 'range', 7) 
print 'two: %r' % allowed_builtins['result'] 

et vous verrez cette sortie:

one: '' 
two: [0, 1, 2, 3, 4, 5, 6] 

le result dans le __dict__ du module courant est bien sûr pas affecté (comment pourrait-il concevable être, puisque ce dict est jamais passé à la exec en question ?!) - le dictionnaire allowed_builtins est évidemment celui qui est affecté, car il est le dict passé comme le « dictionnaire global » et il est une déclaration global dans la chaîne étant exec uted!

+0

merci, je comprends ce que je faisais mal maintenant. – jacob