Как получить имя переменной в Python во время выполнения?

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

например:

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

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

Ответ 1

здесь базовая (может быть, странная) функция, которая показывает имя своего аргумента... идея заключается в анализе кода и поиске вызовов функции (добавленной в методе 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

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

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

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

Ответ 3

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

Ответ 4

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

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>

Ответ 5

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

def my_print(var_str) :
    print var_str+':', globals()[var_str]

Ответ 6

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

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}