Python - заменить функцию в exec и импортированные в нее модули - PullRequest
0 голосов
/ 26 июня 2018

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

Это пример того, чего я пытаюсь достичь:

from inspect import cleandoc


def new_print(val):
    print('Hello', val)

code_inner = cleandoc("""
    def bar():
        print('Inner')
""")

with open('inner.py', 'w') as f:
    f.write(code_inner)

code_outer = cleandoc("""
    import inner
    print('Outer')
    inner.bar()
""")

exec(code_outer, {'print': new_print}, {})

Это ответ, который я получаю:

Hello Outer
 Inner

И вот что я хотел бы иметь:

Hello Outer
Hello Inner

Есть ли способ передать новые глобальные переменные, встроенные функции или список переменных в импортируемый модуль?

1 Ответ

0 голосов
/ 26 июня 2018

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

code_inner = cleandoc("""
    def bar(d):
        globals().update(d)
        print('Inner')
""")


code_outer = cleandoc("""
    import inner
    print('Outer')
    inner.bar({'print': print})
""")

В качестве альтернативы, без изменения функции бара вы можете передать ее модуль глобальным образом, например:

code_outer = cleandoc("""
    import inner
    inner.print = print
    print('Outer')
    inner.bar()
""")
...