Как можно распечатать имя переменной в Python? [дубликат]

Попробуйте это. Этот текст написан в машинописном тексте.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
63
задан Constantin 26 February 2009 в 23:11
поделиться

8 ответов

Если Вы настаиваете, вот, некоторые ужасные осматривают - базирующееся решение.

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)

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

92
ответ дан Constantin 7 November 2019 в 12:26
поделиться

Отвечать на Ваш исходный вопрос:

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

Пример:

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

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

60
ответ дан Community 7 November 2019 в 12:26
поделиться

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

, Например:

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

, Какой из тех двух является теперь корректной переменной? Нет никакого различия между a и b.

был подобный вопрос прежде.

14
ответ дан Community 7 November 2019 в 12:26
поделиться

При попытке сделать это, это означает выполнение чего-то не так. Рассмотрите использование 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
10
ответ дан recursive 7 November 2019 в 12:26
поделиться

Что-то вроде этого будет работать на Вас?

>>> 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}
2
ответ дан myroslav 7 November 2019 в 12:26
поделиться

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

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

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

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

Этот вид вещи имеет тенденцию быть более читаемым, чем альтернативы даже при том, что это требует переменных осмотра по имени.

7
ответ дан Ryan Bright 7 November 2019 в 12:26
поделиться

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

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

2
ответ дан James Brady 7 November 2019 в 12:26
поделиться

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

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

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

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

2
ответ дан Nikhil Chelliah 7 November 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: