Получение имени переменной python

Python Mystery: Как получить имена переменных?

Сегодня мы обсуждаем, казалось бы, простую и не легкую проблему в Python. Этот вопрос: как получить имя переменной?

Например, с учетом переменной var Назначьте это «foo». который

Теперь нам нужно получить переменные var Имя «var».

Попробуйте следующие два метода. Что мы получаем, так это значение переменной «foo», а не имя «var» переменной.

In [2]: print var foo In [3]: print "%s" % var foo 

Как это сделать? Затем мы исследуем переменные var Все атрибуты и методы:

In [4]: print dir(var) ['__add__', '__class__', '__contains__', ..., 'capitalize', 'center', ...] 

После попытки я обнаружил, что var 71 (этот номер проходит по номеру print len(dir(var)) В) атрибутах и ​​методах ни один из них не может заставить нас получить var название.

Это можно увидеть,Легко получить значение переменной (значение), а имя переменной (имя) выглядит очень сложно

Два примера

Перед дальнейшим изучением других решений давайте посмотрим, имеет ли «имя переменной приобретения» практическое значение в программировании Python. Здесь два небольших примера объясняют преимущества «получения имен переменных».

Читайте также:  Www opel omega ru index php

Пример 1

Первым примером является ненормальное лечение. Если имя переменной может быть получено, то сообщение об ошибке Python (сообщение об ошибке) станет более значимым. Например:

 1 first_num, second_num = 1, 2 2 if first_num != second_num: ----> 3 raise RuntimeError("%s is not equal to %s" % (first_num, second_num)) RuntimeError: 1 is not equal to 2 

Сообщение об ошибке здесь RuntimeError: 1 is not equal to 2 Читаемость относительно плоха. Что такое 1 и 2? Нам нужно понять исходный код, чтобы понять. Если вы можете вывести 1 и 2 имена переменных в сообщении об ошибке first_num и second_num Это, несомненно, хорошая вещь.

Пример 2

Второй пример — создать словарь, основанный на наборе переменных. Известно несколько переменных, name, address, age, gender , Мы надеемся создать словарь, основанный на них person Сущность Как правило, можно достичь так:

person = > person["name"] = name person["address"] = address person["age"] = age person["gender"] = gender 

Хотя эта реализация полностью осуществлена, есть два неудобных точка для любителей Python, таких как я. Во -первых, имя переменной повторяется; второе — это оператор назначения (независимо от того, является ли оно = Значительный : Замена) повторить. Когда количество переменных больше, более повторяющиеся ситуации.

Если вы можете использовать следующий цикл для достижения, код может быть более кратким:

for i in [name, address, age, gender]: person[i] = i # Поскольку я являюсь переменным значением, это невозможно 

Приведенные выше два примера показывают, что получение имен переменных хорошо подходит для программирования Python.

Косвенное решение

Тем не менее, мы также видели в предыдущей статье, что трудно получить имя переменной Python. Так почему же вы не можете получить имя переменной Python напрямую? После консультации с соответствующей информацией обнаружено, что в Python имя переменной -это одно (а не два) ссылки на объект. Другими словами, в соответствии с именами переменных, объект, который он указал непосредственно, может быть получен; наоборот, в соответствии с объектом, имя переменной не может быть получено.

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

Поскольку прямой метод невозможным, есть ли какой -либо косвенный метод? Питон inspect Модуль обеспечивает косвенное решение. Примером 2 в качестве примера на основе inspect Для петли реализован как:

import inspect def retrieve_name(var): callers_local_vars = inspect.currentframe().f_back.f_locals.items() return [var_name for var_name, var_val in callers_local_vars if var_val is var] name, address, age, gender = "bob", "hangzhou", 21, "man" person = > for i in [name, address, age, gender]: person[retrieve_name(i)[0]] = i print person 

Выполнить скрипт, результаты соответствуют ожиданиям:

[email protected]:~# python test.py 'gender': 'man', 'age': 21, 'name': 'bob', 'address': 'hangzhou'> 

Основная идея этой схемы: передано inspect Модуль currentframe() Методы получения списка имен и значений, которые содержат все локальные переменные вызывающего абонента, а затем поиск элементов с одинаковым целевым значением из списка, и возвращают соответствующее имя переменной, соответствующее элементу.

Хотя эта схема может работать в некоторых случаях, недостатки очевидны: 1) Сложность реализации выше 2), если существует несколько значений переменных одинакового значения, то функция retrive_name () вернет имена нескольких переменных, поэтому , невозможно получить точные результаты. Основываясь на этих двух факторах, этот метод не имеет большого практического значения.

Подведем итог

Таким образом, мы видим, что в программировании Python нет эффективного и надежного метода для получения имен переменных. К счастью, хотя имя переменной является хорошим в некоторых сценариях, эта выгода часто не является значимой, и, как правило, есть альтернативы. Следовательно, хотя Python не может подтвердить необходимость получения имен переменных, ежедневные работы по разработке Python не будут затронуты.

Источник

Re: python: название переменной в виде строки

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

Re: python: название переменной в виде строки

А нельзя ли как-нибудь «выдрать» название переменной, например, из locals(); там оно хранится в виде строки (и как-то в эту строку транслируется). Получается, что по названию переменной можно определить её значение, а наоборот — нет?

Re: python: название переменной в виде строки

А зачем вам это нужно? Объясните задачу, может быть можно решить её по другому? > А нельзя ли как-нибудь "выдрать" название переменной, например, из locals(); locals() возвращает словарь, где ключи - имена переменных. Выдрать можно, например, так: for name,value in locals().items(): if value is x: print name Результат может быть не единственным, если на это значение есть несколько ссылок. Ну и эффективность, конечно же, не та.

Re: python: название переменной в виде строки

>А зачем вам это нужно? 1. Конкретная задача: есть список переменных, значения которых нужно отобразить в полях формы. Причём название поля = название переменной. 2. Интересно :) >может быть можно решить её по другому? да, конечно, на данный момент я делаю примерно так: for entry, value in (("x", x), ("y", y), ("z", z)): gui.get_widget (entry).set_text (value)

список переменных

> 1. Конкретная задача: есть список переменных, значения которых нужно отобразить в полях формы. Причём название поля = название переменной.

А зачем их делать отдельными переменными? Поместите их все в словарь.

Источник

Как получить имя переменной в Python во время выполнения?

Есть ли способ узнать во время выполнения имя переменной (из кода)? Или имена переменных, забытые во время компиляции (байт-код или нет)? например:

>>> vari = 15 >>> print vari.~~name~~() 'vari'

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

Вот пример использования: есть переменные foo, bar, baz, я хочу получить словарь точно так же, как <'foo': foo, 'bar': bar, 'baz': baz>. Конечно, я могу напечатать как то, что я только что сделал, но не очень лаконично. locals() , на мой взгляд, передают слишком много информации, не идеально. То, что я ожидаю, это функция вроде magic_func([foo,bar,baz]) которая возвращает magic_func([foo,bar,baz]) мне словарь

8 ответов

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

def display(var): import inspect, re callingframe = inspect.currentframe().f_back cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE) print m.group(1), type(var), var 

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

но приведет к неожиданному результату:

display(first_var) display(second_var) 

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

В целом я предполагаю, что статический анализ кода может дать более надежный результат, но я слишком ленив, чтобы проверить его сейчас

Источник

Как получить строковые имена переменных в python и несколько трюков с matplotlibe

Вернуть строкове имя конкретной переменной не получится. так как на один и тот же объект может ссылаться несколько переменных. Но можно вернуть все переменные для конкретного объета. В данном примере две разные переменные ссылаются на два разных объекта (которые под капотом python на самом деле один объект):

import inspect x = 1 y = 1 def retrieve_name(var): callers_local_vars = inspect.currentframe().f_back.f_locals.items() return [var_name for var_name, var_val in callers_local_vars if var_val is var] print(retrieve_name(y)) ['x', 'y'] 

Как получить строкове значение имени функции в python

__name__ работает с build in функциями. func_name нет

>>> import time >>> time.time.func_name Traceback (most recent call last): File "", line 1, in ? AttributeError: 'builtin_function_or_method' object has no attribute 'func_name' >>> time.time.__name__ 'time' 

Как удалить линии сетки в [matplotlibe]

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

for i in range(4): for j in range(3): axs[i, j].grid(None) 
%matplotlib inline from matplotlib import pyplot as plt plt.rcParams["axes.grid"] = False 

Как задать размеры изображения для subplots в matplotlib

fig, axs = plt.subplots(nrows=3, ncols=3) fig.set_figheight(25) fig.set_figwidth(25) 

Как создать анотированную матрицу в matplotlib

Вот подробный гайд на эту тему. Если совсем лень, можно использовать seaborn.heatmap

Источник

Оцените статью