Как получить имя переменной в Python во время выполнения? - PullRequest
29 голосов
/ 01 июня 2009

Есть ли способ узнать во время выполнения имя переменной (из кода)? Или имена переменных, забытые во время компиляции (байт-код или нет)?

например:.

>>>  vari = 15
>>>  print vari.~~name~~()
'vari'

Примечание : я говорю о простых переменных типа данных (int, str, list и т. Д.)

Ответы [ 8 ]

31 голосов
/ 01 июня 2009

Имена переменных не забываются, вы можете получить доступ к переменным (и посмотреть, какие у вас есть переменные) с помощью самоанализа, например,

>>> i = 1
>>> locals()["i"]
1

Однако, поскольку в Python нет указателей, невозможно ссылаться на переменную без фактического написания ее имени. Поэтому, если вы хотите напечатать имя переменной и ее значение, вы можете использовать locals() или аналогичную функцию. ([i] становится [1], и нет способа получить информацию о том, что 1 фактически пришло от i.)

10 голосов
/ 01 июня 2009

Имена переменных сохраняются в скомпилированном коде (именно так может работать, например, встроенная dir), но отображаемое здесь отображение меняется от имени к значению, а не наоборот. Таким образом, если есть несколько переменных, каждая из которых стоит, например, 23, невозможно отличить их друг от друга, основываясь только на значении 23.

4 голосов
/ 05 марта 2013

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

import sys
def print_var(var_name):
    calling_frame = sys._getframe().f_back
    var_val = calling_frame.f_locals.get(var_name, calling_frame.f_globals.get(var_name, None))
    print (var_name+':', str(var_val))

Итак, следующий код:

global_var = 123
def some_func():
    local_var = 456
    print_var("global_var")
    print_var("local_var")
    print_var("some_func")

some_func()

производит:

global_var: 123
local_var: 456
some_func: <function some_func at 0x10065b488>
3 голосов
/ 28 июня 2011

Это будет работать для простых типов данных (str, int, float, list и т. Д.)

def my_print(var_str) :
    print var_str+':', globals()[var_str]
2 голосов
/ 08 апреля 2015

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

def display(var):
    import inspect, re
    callingframe = inspect.currentframe().f_back
    cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines
    m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE)
    print m.group(1), type(var), var

пожалуйста, обратите внимание: Получение нескольких строк из кода вызова помогает в случае разделения вызова, как показано в следующем примере:

display(
        my_var
       )

но даст неожиданный результат на этом:

display(first_var)
display(second_var)

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

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

2 голосов
/ 30 октября 2013

Ты можешь это сделать, это просто не красиво.

import inspect, sys


def addVarToDict(d, variable):
    lineNumber = inspect.currentframe().f_back.f_lineno
    with open(sys.argv[0]) as f:
        lines = f.read().split("\n")

    line = lines[lineNumber-1]

    varName = line.split("addVarToDict")[1].split("(")[1].split(",")[1].split(")")[0].strip()
    d[varName] = variable


d = {}

a=1

print d # {}
addVarToDict(d,a)
print d # {'a': 1}
1 голос
/ 09 июля 2009

Я попробовал следующую ссылку из поста выше, но безуспешно: Гугл вернул этот.

http://pythonic.pocoo.org/2009/5/30/finding-objects-names

0 голосов
/ 01 июня 2009

Буквально вчера я увидел сообщение в блоге с рабочим кодом, который делает именно это. Вот ссылка:

http://pyside.blogspot.com/2009/05/finding-objects-names.html

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