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
defvarname(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
Чтобы ответить на ваш первоначальный вопрос:
defnamestr(obj, namespace): return [name for name in namespace if namespace[name] is obj]
Пример:
>>> a = 'some var' >>> namestr(a, globals()) ['a']
Вместо того, чтобы запрашивать подробности конкретного решения, я рекомендую описать проблему, с которой вы столкнулись; я думаю, вы получите лучшие ответы. Я говорю это, потому что почти наверняка есть лучший способ сделать то, что вы пытаетесь сделать. Доступ к именам переменных таким образом обычно не требуется для решения проблем на любом языке.
Тем не менее, все ваши имена переменных уже есть в словарях, которые доступны через встроенные функции locals и globals. Используйте правильное имя для области, которую вы проверяете.
Одна из немногих распространенных идиом для проверки этих словарей - для простой интерполяции строк:
>>> first = 'John' >>> last = 'Doe' >>> print'%(first)s %(last)s' % globals() John Doe
Такого рода вещи, как правило, немного более удобочитаемы, чем альтернативные варианты, даже если для этого требуется проверять переменные по имени.