2015-10-01 3 views
0

RestrictedPython модуль имеет restricted compiler, в котором вы можете скомпилировать код и настроить некоторые функции python. Например, вы можете заменить встроенную функцию print.Настроить функцию компиляции в python?

Это то, что мне нужно. Мне нужно скомпилировать некоторый код, но определить мою собственную функцию печати. Я не могу использовать этот ограниченный компилятор, потому что у него есть много ограничений, которые мне сейчас не нужны.

Знаете ли вы какой-либо другой компилятор, в котором я могу определить свою собственную функцию печати?

+0

_Why_ вам нужно заменить функцию 'print'? Я уверен, что есть лучший/более простой способ добиться того, что вам нужно. –

+0

Мне нужно выполнить код python во время выполнения. Я делаю это, используя команды compile и exec. Что-то, что я хотел бы сделать, это перенаправить все отпечатки (от этого кода) до некоторой предопределенной функции. (безопасность не нужна) –

+0

Точнее, я разрабатываю веб-страницу, и мне нравится перенаправлять все отпечатки в браузер. Я сделал это, используя ограниченный питон, но я больше не могу его использовать. –

ответ

2

Просто используйте обычный Python; в Python 2: использование

from __future__ import print_function 

или использовать Python 3, и print() является тогда функция. Вы можете переопределить эту функцию:

from __future__ import print_function 
try: 
    # Python 2 
    from __builtin__ import print as builtin_print 
except ImportError: 
    from builtins import print as builtin_print 

def print(*args, **kw): 
    # do something extra with *args or **kw, etc. 
    builtin_print(*args, **kw) 

Как и любой другой встроенной функции вы можете определить свою собственную функцию с тем же именем. В приведенном выше примере я использовал модуль __builtin__/builtins для доступа к оригиналу.

Если вы используете exec(), вы можете передать в функцию print() вы определили в качестве дополнительного имени в пространстве имен вы передаете в:

exec(code_to_execute, {'print': your_print_function}) 

Для Python 2, вы должны скомпилировать код первым, чтобы выключить оператор print и включить функцию print(); использовать compile() function для создания объекта кода, чтобы перейти к exec высказыванию:

import __future__ 

code_to_execute = compile(
    code_to_execute_in_string, '', 'exec', 
    flags=__future__.print_function.compiler_flag) 

Я использовал __future__ module, чтобы получить флаг правильного компилятора.

+0

Не уверен, что это проблема, но это не изменит поведение 'print' в импортированном модуле OP не имеет никакого контроля, не так ли? –

+1

@tobias_k: это не так. Вы можете использовать 'import builtins; builtins.print = your_print_function', чтобы изменить функцию * везде * (написание Python 3, при необходимости настроить Python 2). –

+0

Мне нравится делать это, но только в коде, исполняемом с помощью exec или eval. –

Смежные вопросы