2013-10-27 4 views
0
>>> compile(""" 
def some_function(x): 
    return x+2 
some_function""",'compiled function','single') 
Traceback (most recent call last): 
    File "<pyshell#3>", line 4, in <module> 
    some_function""",'compiled function','single') 
    File "compiled function", line 4 
    some_function 
       ^
SyntaxError: unexpected EOF while parsing 

ответ

2

Если вы хотите скомпилировать мульти-строку оператора с compile а, single должен быть exec. Кроме того, после компиляции кода вы должны выполнить его и захватить глобальные переменные, чтобы получить доступ к созданной функции:

def anonymous(code): 
    # To fix the indentation 
    fixed_code = '\n'.join(line[4:] for line in code.splitlines()) 

    _globals = {} 
    exec(compile(fixed_code, '<string>', 'exec'), _globals) 

    if 'f' not in _globals: 
     raise ValueError('You must name your function "f"') 

    return _globals['f'] 

anonymous(''' 
    def f(x): 
     return x + 2 
''')(12) 
+0

Это не код Python 3. – ThePiercingPrince

+0

@LinuxDistance: просто превратите 'exec' в вызов функции, и он будет работать. Python 3 и Python 2 не такие разные. – Blender

1

Вопрос не очень ясен, но является ли это примером, который вы хотите?

>>> c=compile('''\ 
... def some_function(x): 
... return x+2 
... print(some_function(5)) 
... ''','<string>','exec') 
>>> exec(c) 
7 
>>> c=compile('7+2','<string>','eval') 
>>> eval(c) 
9 
Смежные вопросы