Как получить имя переменной в 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}
Ответ 7
Я пробовал следующую ссылку из поста выше, без успеха:
Googling вернул это.
http://pythonic.pocoo.org/2009/5/30/finding-objects-names
Ответ 8
Только вчера я увидел сообщение в блоге с рабочим кодом, который делает именно это. Здесь ссылка:
http://pyside.blogspot.com/2009/05/finding-objects-names.html