Преобразовать имя переменной для строкового представления?

Вы забыли присоединиться к некоторым столам? Если нет, вам, вероятно, придется использовать некоторые псевдонимы.

56
задан Brandon Pelfrey 7 October 2009 в 22:06
поделиться

6 ответов

Это не очень Pythonesque, но я был любопытен и нашел это решение. Необходимо копировать globals словарь, так как его размер изменится, как только Вы определяете новую переменную.

def var_to_name(var):
    # noinspection PyTypeChecker
    dict_vars = dict(globals().items())

    var_string = None

    for name in dict_vars.keys():
        if dict_vars[name] is var:
            var_string = name
            break

    return var_string


if __name__ == "__main__":
    test = 3
    print(f"test = {test}")
    print(f"variable name: {var_to_name(test)}")

, который возвращается:

test = 3
variable name: test
0
ответ дан 26 November 2019 в 17:27
поделиться

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

>>> x = 52
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 
'x': 52, '__doc__': None, '__package__': None}

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

>>> globals().keys()[2]
'x'

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

>>> for k in globals().keys():
...   if not k.startswith("_"):
...     print k
...
x
>>>

Вы можете отфильтровать системные переменные, как это, но вы все равно получите все свои собственные элементы. Просто запуск этого кода выше создал другую переменную «k», которая изменила позицию «x» в dict.

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

7
ответ дан 26 November 2019 в 17:27
поделиться

Это невозможно.

В Python действительно нет такой вещи, как «переменная». На самом деле у Python есть «имена», с которыми могут быть связаны объекты. Для объекта не имеет значения, к каким именам он может быть привязан. Он может быть связан с десятками разных имен или ни с одним.

Рассмотрим этот пример:

foo = 1
bar = 1
baz = 1

Теперь предположим, что у вас есть целочисленный объект со значением 1, и вы хотите работать в обратном направлении и найти его имя. Что бы вы напечатали? Этот объект привязан к трем различным именам, и все они одинаково действительны.

В Python имя - это способ доступа к объекту, поэтому нет возможности работать с именами напрямую. Может быть какой-нибудь хитрый способ взломать байт-коды Python или что-то еще, чтобы получить значение имени, но это в лучшем случае салонный трюк.

Если вы знаете, что хотите print foo для печати «foo» , вы можете просто выполнить print «foo» в первую очередь.

РЕДАКТИРОВАТЬ: Я немного изменил формулировку, чтобы сделать ее более ясной. Кроме того, вот еще лучший пример:

foo = 1
bar = foo
baz = foo

На практике Python повторно использует один и тот же объект для целых чисел с общими значениями, такими как 0 или 1, поэтому первый пример должен связывать один и тот же объект со всеми тремя именами. Но этот пример предельно ясен: один и тот же объект привязан к foo, bar и baz.

Python повторно использует один и тот же объект для целых чисел с общими значениями, такими как 0 или 1, поэтому первый пример должен связывать один и тот же объект со всеми тремя именами. Но этот пример предельно ясен: один и тот же объект привязан к foo, bar и baz.

Python повторно использует один и тот же объект для целых чисел с общими значениями, такими как 0 или 1, поэтому первый пример должен связывать один и тот же объект со всеми тремя именами. Но этот пример предельно ясен: один и тот же объект привязан к foo, bar и baz.

8
ответ дан 26 November 2019 в 17:27
поделиться
print "var"
print "something_else"

Или вы что-то имели в виду_else?

-1
ответ дан 26 November 2019 в 17:27
поделиться

Чего вы пытаетесь достичь? Нет абсолютно никаких причин делать то, что вы описываете, и, вероятно, есть гораздо лучшее решение проблемы, которую вы пытаетесь решить.

Самая очевидная альтернатива тому, что вы запрашиваете, - это словарь. Например:

>>> my_data = {'var': 'something'}
>>> my_data['something_else'] = 'something'
>>> print my_data.keys()
['var', 'something_else']
>>> print my_data['var']
something

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

#!/usr/bin/env python2.6
class NewLocals:
    """Please don't ever use this code.."""
    def __init__(self, initial_locals):
        self.prev_locals = list(initial_locals.keys())

    def show_new(self, new_locals):
        output = ", ".join(list(set(new_locals) - set(self.prev_locals)))
        self.prev_locals = list(new_locals.keys())
        return output
# Set up
eww = None
eww = NewLocals(locals())

# "Working" requested code

var = {}

print eww.show_new(locals())  # Outputs: var

something_else = 3
print eww.show_new(locals()) # Outputs: something_else

# Further testing

another_variable = 4
and_a_final_one = 5

print eww.show_new(locals()) # Outputs: another_variable, and_a_final_one
3
ответ дан 26 November 2019 в 17:27
поделиться

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

print varname(something_else)

Такой функции нет, но если бы она была, это было бы бессмысленно. Вы должны ввести something_else , поэтому вы также можете просто ввести кавычки слева и справа от него, чтобы вывести имя в виде строки:

print "something_else"
3
ответ дан 26 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

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