Получить местных жителей от вызова пространства имен в Python
Я хочу получить локальные переменные из Python из вызываемой функции. Есть какой-либо способ сделать это? Я понимаю, что это не подходит для большинства программ, но я в основном строю отладчик. Например:
def show_locals():
# put something in here that shows local_1.
local_1 = 123
show_locals() # I want this to show local_1.
Что я положу в теле show_locals
? Если мне нужно изменить оператор вызова, какова минимальная модификация, которую я могу сделать?
Примечание: это должно работать, когда show_locals
находится в другом модуле к своему вызывающему.
2 ответа
Если вы пишете отладчик, вы захотите интенсивно использовать inspect
модуль:
def show_callers_locals():
"""Print the local variables in the caller's frame."""
import inspect
frame = inspect.currentframe()
try:
print(frame.f_back.f_locals)
finally:
del frame
Возможно, стоит отметить, что метод из принятого ответа, который считывается из кадра стека вызывающего абонента:
import inspect
def read_from_caller(varname):
frame = inspect.currentframe().f_back
try:
v = frame.f_locals[varname]
return v
finally:
del frame
также можно записать в пространство имен вызывающего абонента:
import inspect
def write_in_caller(varname, v):
frame = inspect.currentframe().f_back
try:
frame.f_locals[varname] = v
finally:
del frame
Если вы поместите это в модуль с именем "access_caller", тогда
import access_caller
access_caller.write_in_caller('y', x)
это сложный способ написания
y = x
(Я пишу это как свежий ответ, потому что у меня недостаточно очков репутации, чтобы написать комментарий.)
Вы используете встроенный Python, dir() или vars ():
вары (объект)
Примеры использования dir () смотрите в этом посте.
Примеры использования vars:
>>> class X:
... a=1
... def __init__(self):
... b=2
...
>>>
>>> vars(X)
{'a': 1, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x100488848>}
>>>
>>> vars(X())
{}
Потенциально проблемный факт: новые классы стиля не возвращают тот же результат
>>> class X(object):
... a=1
... def __init__(self):
... b=2
...
>>>
>>> vars(X)
<dictproxy object at 0x1004a1910>
>>> vars(X())
{}
Также: для экземпляра класса (нового и старого стиля), если вы добавите переменную после создания экземпляра, vars вернет dict объекта следующим образом:
>>> x = X()
>>> x.c = 1
>>> vars(x)
{'c': 1}
>>>