Получить местных жителей от вызова пространства имен в Python - PullRequest
30 голосов
/ 08 июля 2011

Я хочу получить локальные переменные из 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 ]

62 голосов
/ 08 июля 2011

Если вы пишете отладчик, вам нужно интенсивно использовать модуль 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
0 голосов
/ 08 июля 2011

Вы используете встроенный 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}
>>> 

См .: http://docs.python.org/library/functions.html#vars

...