Подтвердить что ты не робот

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

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

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

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

EDIT:

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

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

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

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

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

4b9b3361

Ответ 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

Вы не можете, так как в Python нет переменных, но только имена.

Например:

> a = [1,2,3]
> b = a
> a is b
True

Какая из этих двух теперь правильная переменная? Нет разницы между a и b.

Ранее был похожий вопрос.

Ответ 4

Если вы пытаетесь это сделать, значит, вы делаете что-то неправильно. Вместо этого используйте 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

Ответ 5

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

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

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

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

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

Ответ 6

С нетерпеливой оценкой переменные по существу превращаются в свои ценности в любое время, когда вы смотрите на них (перефразируя). Тем не менее, у Python есть встроенные пространства имен. Например, locals() вернет словарь, сопоставляющий имена переменных переменных переменных, и globals() делает то же самое для модуля. Таким образом:

for name, value in globals().items():
    if value is unknown_variable:
        ... do something with name

Обратите внимание, что вам не нужно ничего импортировать, чтобы иметь доступ к locals() и globals().

Кроме того, если для значения есть несколько псевдонимов, итерация через пространство имен находит только первый.

Ответ 7

Будет ли что-то подобное вам работать?

>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2

И в вашем примере:

>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__name__ = '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}

Ответ 8

В отношении пересмотренного вопроса о том, как читать параметры конфигурации, я настоятельно рекомендую сэкономить время и силы и использовать ConfigParser или (мой предпочтительный инструмент) ConfigObj.

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