Вопрос-Ответ

How can you print a variable name in python? [duplicate]

Как можно напечатать имя переменной в python?

Допустим, у меня есть переменная с именем choice оно равно 2. Как мне получить доступ к имени переменной? Что-то эквивалентное

In [53]: namestr(choice)
Out[53]: 'choice'

для использования при создании словаря. Есть хороший способ сделать это, но я просто упускаю его.

Редактировать:

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

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

При запросе значений отображается ранее использованное значение, а при вводе пустой строки будет использоваться ранее использованное значение.

Мой вопрос возникает потому, что когда дело доходит до написания словаря, в который были отсканированы эти значения. Если нужен параметр, я запускаю get_param который обращается к файлу и находит параметр.

Я думаю, что смогу избежать проблемы целиком, прочитав файл .config один раз и создав из него словарь. Изначально я избегал этого по... причинам, которые я уже не помню. Идеальная ситуация для обновления моего кода!

Переведено автоматически
Ответ 1

Если вы настаиваете, вот какое-то ужасное решение на основе проверки.

import inspect, re

def varname(p):
for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
if m:
return m.group(1)

if __name__ == '__main__':
spam = 42
print varname(spam)

Я надеюсь, это вдохновит вас пересмотреть существующую у вас проблему и поискать другой подход.

Ответ 2

Чтобы ответить на ваш первоначальный вопрос:

def namestr(obj, namespace):
return [name for name in namespace if namespace[name] is obj]

Пример:

>>> a = 'some var'
>>> namestr(a, globals())
['a']

Как @rbright уже указывал, что бы вы ни делали, вероятно, есть способы получше.

Ответ 3

Если вы пытаетесь это сделать, это означает, что вы делаете что-то неправильно. Рассмотрите возможность использования dict вместо этого.

def show_val(vals, name):
print "Name:", name, "val:", vals[name]

vals = {'a': 1, 'b': 2}
show_val(vals, 'b')

Вывод:

Name: b val: 2
Ответ 4

Вместо того, чтобы запрашивать подробности конкретного решения, я рекомендую описать проблему, с которой вы столкнулись; я думаю, вы получите лучшие ответы. Я говорю это, потому что почти наверняка есть лучший способ сделать то, что вы пытаетесь сделать. Доступ к именам переменных таким образом обычно не требуется для решения проблем на любом языке.

Тем не менее, все ваши имена переменных уже есть в словарях, которые доступны через встроенные функции locals и globals. Используйте правильное имя для области, которую вы проверяете.

Одна из немногих распространенных идиом для проверки этих словарей - для простой интерполяции строк:

>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

Такого рода вещи, как правило, немного более удобочитаемы, чем альтернативные варианты, даже если для этого требуется проверять переменные по имени.

python dictionary