У меня есть модуль "b", импортирующий метод из модуля "a", где метод "a.method" использует переменную, определенную в "a", должен быть переопределен в "b". просто в кодах:
module a.py:
local_var = 1
def method():
print local_var
module b.py:
from a import method
local_var = 2
print method()
запуск python b.py prints 1, а не 2. В моем сценарии импортированный метод - это метод django, поэтому я не могу изменить модуль, и я не хочу скопировать метод в свой модуль и изменить его.
Как я могу переопределить локальную переменную другого модуля и использовать импортированный метод для новой переменной?
Попробуйте встроенную функцию exec
:
Во всех случаях, если необязательные части опущены, код выполняется в текущей области. Если указано только первое выражение после in, это должен быть словарь, который будет использоваться как для глобальных, так и для локальных переменных. Если даны два выражения, они используются для глобальных и локальных переменных, соответственно. Если предоставлено, локальные жители могут быть любым объектом сопоставления.
Но я думаю, вам лучше не использовать такие хаки. Передайте переменную в качестве аргумента функции или используйте классы.
Рабочий код:
a.py:
local_var = 1
def method():
print local_var
b.py:
from a import method
import inspect
code = inspect.getsource(method)
local_var = 2
method()
print code
exec code
method()
python b.py
:
vic@ubuntu:~/Desktop$ python b.py
1
def method():
print local_var
2
vic@ubuntu:~/Desktop$
Вы не можете. Это по дизайну. Каждый модуль имеет собственное пространство имен.
Однако вы можете сохранить текущее значение var, присвоить новое значение, вызвать метод и восстановить исходное значение.
# module a.py:
local_var = 1
def method():
print local_var
# module b.py:
import a
old_local_var = a.local_var
a.local_var = 2
print method()
a.local_var = old_local_var
Как отметил в комментарии джейор, этот метод следует использовать с осторожностью. Это больше или меньше рубить. Единственное допустимое использование для этого, о котором я могу думать, - это тестирование или последнее средство, когда все остальное (включая Чака Норриса) потерпело неудачу.