2015-04-19 1 views
2

Можно ли установить глобальную переменную в основном модуле из импортированного модуля (используя строку) в python?Заменить функцию в основном модуле из импортированного модуля в Python

(Да, я знаю, что это не лучшие практики.)

В конце концов, я хочу, чтобы это выглядело примерно так:

main.py

import mod 
def func(): 
    print('failure') 
mod.run(func) 
func() 

mod.py

def func2(): 
    print('success') 
def run(f): 
    globals()[f.__name__] = func2 

Результат: 'failure', поскольку глобальный относительно модуля.

Я хочу переписать переменную func с func2, из модуля.

Другой нюанс: переменная func изменения, так что мне нужно обратиться к нему быть f.__name__ string

Я понимаю, что этот подход не будет работать, если имя func были изменены, прежде чем он изменился с помощью mod.run(func).

Мой вопрос: Возможно ли изменить функцию в основном модуле из импортированного модуля, не меняя код в приведенном выше примере main.py? Если да, то как?

ответ

3

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

def func2(): 
    print('success') 
def run(f): 
    f.__code__ = func2.__code__ 

Это изменяет фактическую функцию объекта, на который ссылается func, и только частично используя код выше, поэтому дальнейшее хирургическое вмешательство может потребоваться (например, для обновления func.__name__ быть func2 вместо func), и вы можете сделать реальная копия func, прежде чем обезьяна будет ее исправлять.

+0

код действительно будет f .__ code__ = func2__code__ Но это выполняет «то, что я действительно пытался сделать». – Paul

+1

Ах, да, 'func_code' было старым именем 2.x для того же атрибута. (Я забыл, когда был введен «__code__», но он доступен как минимум 2.7, а также 3.x). – chepner

+0

Спасибо за помощь, хотя я понял, что вы имели в виду, и, вероятно, по-прежнему будет бороться с этой проблемой. – Paul