Заставить импортированный метод использовать локальные переменные - PullRequest
2 голосов
/ 26 августа 2011

У меня есть модуль '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 печатает 1, а не 2. В моем сценарии импортированный метод является методом django, поэтому я не могу изменить модуль, а также я не хочу копироватьметод моего модуля и изменить его.

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

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Попробуйте встроенную функцию 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$ 
1 голос
/ 26 августа 2011

Вы не можете.Это по замыслу.Каждый модуль имеет свое собственное пространство имен.

Однако вы можете сохранить текущее значение 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

Как отметил в комментарии Jyore - этот метод следует использовать с осторожностью.Это более или менее взломать.Единственное допустимое использование для этого, о котором я могу думать, - это тестирование или последнее средство, когда все остальное (включая Чака Норриса) не удалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...