Я хотел бы иметь возможность получить имя переменной в виде строки, но я не знаю, обладает ли Python такими возможностями самоанализа. Что-то вроде:
>>> print(my_var.__name__)
'my_var'
Я хочу сделать это, потому что у меня есть куча переменных, которые я хотел бы превратить в словарь, например:
bar = True
foo = False
>>> my_dict = dict(bar=bar, foo=foo)
>>> print my_dict
{'foo': False, 'bar': True}
Но я бы хотел что-то более автоматическое, чем это.
Python есть locals()
и vars()
, так что я думаю, что есть способ.
Ответы:
Вы пытаетесь это сделать?
пример
источник
print('x: ' + x)
одного можно было писатьmagic_print(x)
и иметь один и тот же вывод без записи имени переменной дважды.Как уже было сказано, это не то, что вы делаете в Python - переменные на самом деле являются отображениями имен для объектов.
Однако вот один из способов попробовать это сделать:
источник
True
), то может быть возвращено непреднамеренное имя переменной.id(v) == id(a)
вместоv is a
? Это не удастся для объектов, связанных с несколькими переменными, такими как целые, строки и любые аналогично реализованные пользовательские типы.v is a
будет лучшим выбором. И да, безусловно, опасно, учитывая все возможные подводные камни, которые могут возникнуть! ;-)Я хотел сделать это довольно много. Этот хак очень похож на предложение rlotun, но это однострочник, что важно для меня:
Python 3+
источник
iteritems()
заменяется наitems()
spam = 1; blah = 1; blah_name = [ k for k,v in locals().items() if v is blah][0]; print(blah_name)
выходыspam
spam = 1, blah = 1; assert spam is blah
. Решение ломается при сравнении примитивных типов данных.Это взломать Он не будет работать на всех дистрибутивах реализации Python (в частности, на тех, которые не имеют
traceback.extract_stack
.)Обратите внимание, что этот хак хрупок:
(вызов make_dict в 2 строки) не будет работать.
Вместо того , чтобы пытаться генерировать Dict из значений
foo
иbar
, было бы гораздо более Pythonic для создания Dict из строки имен переменных'foo'
и'bar'
:источник
print("a_very_long_name: {}'.format(a_very_long_name))
кто заботится!Это невозможно в Python, который действительно не имеет «переменных». У Python есть имена, и для одного и того же объекта может быть несколько имен.
источник
Я думаю, что моя проблема поможет проиллюстрировать, почему этот вопрос полезен, и он может дать немного больше понимания того, как на него ответить. Я написал небольшую функцию для быстрой внутренней проверки различных переменных в моем коде. По сути, в нем перечислены имя переменной, тип данных, размер и другие атрибуты, поэтому я могу быстро отследить любые ошибки, которые я допустил. Код прост:
Поэтому, если у вас сложная ситуация со словарем / списком / кортежем, было бы весьма полезно, чтобы интерпретатор возвратил имя переменной, которую вы назначили. Например, вот странный словарь:
Я не уверен, что поставлю это в нужное место, но подумал, что это может помочь. Я надеюсь, что это так.
источник
myconnection
может ли указывать на логическое значение в одной точке, целое число в другое время и соединение с сокетом в другой точке выполнения кода?Я написал небольшую полезную функцию, основанную на ответе на этот вопрос. Я помещаю это здесь в случае, если это полезно.
использование:
источник
Я считаю, что если у вас уже есть конкретный список значений, это способ, описанный @S. Лоттс лучший; однако способ, описанный ниже, хорошо работает для добавления всех переменных и классов, добавленных в код, БЕЗ необходимости указывать имя переменной, хотя вы можете указать их, если хотите. Код можно расширить, чтобы исключить классы.
Вывод:
источник
В питоне 3 это легко
это напечатает:
источник
for v in locals()
.for v in list(locals()):
Python3. Используйте inspect для захвата вызывающего локального пространства имен, затем используйте идеи, представленные здесь. Может вернуть более одного ответа, как было указано.
источник
Вот функция, которую я создал для чтения имен переменных. Он более общий и может использоваться в разных приложениях:
Чтобы использовать его в указанном вопросе:
источник
Читая ветку, я увидел очень много трений. Достаточно просто дать плохой ответ, а затем дать кому-нибудь правильный ответ. Во всяком случае, вот что я нашел.
От: [effbot.org] ( http://effbot.org/zone/python-objects.htm#names )
Имена немного отличаются - они на самом деле не являются свойствами объекта, а сам объект не знает, как он называется.
Объект может иметь любое количество имен или вообще не иметь имени.
Имена живут в пространствах имен (таких как пространство имен модуля, пространство имен экземпляра, локальное пространство имен функции).
Обратите внимание: он говорит, что сам объект не знает, как он называется , так что это была подсказка. Объекты Python не являются самоссылочными. Тогда это говорит, Имена живут в пространствах имен . У нас это есть в TCL / TK. Так что, возможно, мой ответ поможет (но это помогло мне)
Таким образом, в конце списка стоит «jj».
Перепишите код как:
Этот неприятный фрагмент кода - это имя переменной / объекта / что угодно, что вы называете педантикой.
Итак, вот оно. Адрес памяти 'jj' тот же, когда мы ищем его напрямую, как и когда мы ищем словарь в глобальном пространстве имен. Я уверен, что вы можете сделать функцию для этого. Просто запомните, в каком пространстве имен находится ваша переменная / объект / wypci.
QED.
источник
print id(jj)
. Второй просто ищет имя, и его можно сделать прощеvars()
.Может быть, я думаю об этом, но ..
источник
variable = 1 \n [k for k,v in locals().items() if id(variable) == id(v)] \n Out[14]: ['variable']
источник
Я загрузил решение для Pypi . Это модуль, определяющий эквивалент функции C #
nameof
.Он перебирает инструкции байт-кода для вызываемого кадра, получая имена переменных / атрибутов, передаваемых ему. Имена находятся в
.argrepr
вLOAD
инструкции следующего имени функции.источник
Я написал пакет волшебства, чтобы творить магию такого рода. Ты можешь написать:
источник
Большинство объектов не имеют атрибута __name__ . (Классы, функции и модули делают; есть ли еще встроенные типы, которые есть?)
Что еще вы ожидаете,
print(my_var.__name__)
кромеprint("my_var")
? Вы можете просто использовать строку напрямую?Вы могли бы «нарезать» диктовку:
В качестве альтернативы:
источник
some_func(var)
, поэтому я попытался указать, что это не очень далекоsome_func("var")
, с dictslice, позволяющим вам получить отображение имя-значение для нескольких переменных одновременно.Ну, я столкнулся с той же самой потребностью несколько дней назад и должен был получить имя переменной, которая указывала бы на объект сам .
И почему это было так необходимо?
Короче говоря, я строил плагин для Maya . Основной плагин был построен с использованием C ++, но графический интерфейс рисуется через Python (так как он не интенсивно использует процессор). Поскольку я пока не знаю, как
return
умножить значения из плагина, кроме значения по умолчаниюMStatus
, поэтому для обновления словаря в Python мне пришлось передать имя переменной, указывая на объект, реализующий графический интерфейс, и который содержит сам словарь, подключаемый модуль, а затем использоватьMGlobal::executePythonCommand()
для обновления словаря из глобальной области видимости Maya .Чтобы сделать то, что я сделал, было что-то вроде:
Я знаю, что это не идеальное решение, поскольку во
globals
многих ключах можно указывать на один и тот же объект, например:и что этот подход не является потокобезопасным. Поправь меня, если я ошибаюсь.
По крайней мере, этот подход решил мою проблему, получив имя любой переменной в глобальной области видимости, которая указывала на сам объект , и передавала его плагину, в качестве аргумента, для его внутреннего использования.
Я попробовал это на
int
(примитивный целочисленный класс), но проблема в том, что эти примитивные классы не обойдутся (пожалуйста, исправьте используемую техническую терминологию, если она ошибочна). Вы могли бы повторно реализовать,int
а затем сделать,int = foo
ноa = 3
никогда не будет объектом,foo
но примитива. Чтобы преодолеть это, вы должныa = foo(3)
приступитьa.name()
к работе.источник
В Python 2.7 и новее есть также словарное понимание, которое делает его немного короче. Если возможно, я бы использовал getattr вместо eval (eval is evil), как в верхнем ответе. Самость может быть любым объектом, контекст которого вы видите. Это может быть объект или locals = localals () и т. Д.
источник
Я работал над похожей проблемой. @ S.Lott сказал: «Если у вас есть список переменных, какой смысл« открывать »их имена?» И мой ответ - просто посмотреть, можно ли это сделать, и если по какой-то причине вы хотите отсортировать переменные по типу в списках. Так или иначе, в моем исследовании я натолкнулся на эту тему, и мое решение немного расширено и основано на решении @rlotun. @Unutbu сказал: «Эта идея имеет свои достоинства, но учтите, что если два имени переменной ссылаются на одно и то же значение (например, True), то может быть возвращено непреднамеренное имя переменной». В этом упражнении , что было правдой , так я имел дело с ним, используя список понимание подобного этому для каждой возможности:
isClass = [i for i in isClass if i != 'item']
. Без этого «элемент» будет отображаться в каждом списке.источник
pi = pie
свой код, вы получите дополнительную запись в своемisFloat
списке. Если вы добавилиtuple_1[0]
в свойmixedDataTypes
список, имя для него не будет найдено, несмотря на то, что «один» присутствует в вашем коде дважды (хотя благодаря интернированию строк они оба будут ссылками на один и тот же объект).pi
и вe
качестве переменных вызывает нежелательный вывод, и это потому, что оба являются частьюmath
библиотеки. Для меня это было просто упражнение, чтобы увидеть, можно ли это сделать, хотя конечный результат не идеален. В моем изучении этого языка чтение книг только заходит так далеко. По моему мнению, если вы действительно хотите выучить язык, вам нужно сыграть «что если» и посмотреть, что вы придумали.вы можете использовать easydict
другой пример:
источник
На python3 эта функция получит самое внешнее имя в стеке:
Это полезно в любом месте кода. Обходит перевернутый стек в поисках первого совпадения.
источник
Хотя это, вероятно, ужасная идея, она совпадает с ответом rlotun, но чаще будет возвращать правильный результат.
Вы называете это так:
источник
должен получить список, а затем вернуть
источник
Он не будет возвращать имя переменной, но вы можете легко создать словарь из глобальной переменной.
источник
С
python-varname
вами легко можно сделать это:pip install python-varname
Отказ от ответственности: я являюсь автором этой библиотеки python-varname.
источник
таким образом получить varname для возможно 'a' или 'b'.
источник