LINUX.ORG.RU

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


0

0

Как в python получить название пременной в виде строки?
Например, int x -> 'x'?

>>> x=1
>>> dir(x)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
>>> dir(x.__getattribute__)
['__call__', '__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__']
>>> x.__getattribute__ ('__name__')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'int' object has no attribute '__name__'
anonymous

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

DKorolkov
()
Ответ на: комментарий от DKorolkov

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

anonymous
()
Ответ на: комментарий от anonymous

А зачем вам это нужно? Объясните задачу, может быть можно решить её по другому?

> А нельзя ли как-нибудь "выдрать" название переменной, например, из locals();

locals() возвращает словарь, где ключи - имена переменных.
Выдрать можно, например, так:

for name,value in locals().items():
  if value is x:
    print name

Результат может быть не единственным, если на это значение есть несколько ссылок.
Ну и эффективность, конечно же, не та.

DKorolkov
()
Ответ на: комментарий от DKorolkov

>А зачем вам это нужно?

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

2. Интересно :)

>может быть можно решить её по другому?

да, конечно, на данный момент я делаю примерно так:

for entry, value in (("x", x), ("y", y), ("z", z)):
    gui.get_widget (entry).set_text (value)

anonymous
()
Ответ на: комментарий от anonymous

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

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

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

DKorolkov
()
Ответ на: комментарий от anonymous

> 2. Интересно :)

Имя переменной 'x' _всегда_ '"x"'. Зачем его откуда-то выдирать, если оно известно заранее?

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

Измени задачу. "Есть список имен переменных, ...". Тогда просто получишь что-то типа

for i in 'a b c d'.split(): gui.get_widget(i).set_text(locals()[i])

DonkeyHot ★★★★★
()
Ответ на: список переменных от DKorolkov

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

имена "x", "y", "z" используются внутри функции; x, y, z - передаются в качестве параметров; можно, конечно, передавать готовый словарь в качестве параметра, но тогда имхо код не так хорошо читается; хотя надо будет попробовать. Спасибо :)

anonymous
()
Ответ на: комментарий от DonkeyHot

>Измени задачу

и впрямь; спасибо!

anonymous
()

короче всего, в конечном счёте, получилось со словарём:

def on_edit_activate (self, widget):
    row = self.treeview.get_selection ().get_selected ()[1]
    preset = {}
    for key in ("npd", "pnpd", "note"):
        preset[key] = self.model[row][self.columns.index (key)]
    result = ModDialog (preset)


class ModDialog:

    def __init__ (self, preset={}):
        ...
        for key in preset:
            self.gui.get_widget (key + "_entry").set_text (preset[key])
        ...

Большое всем спасибо за идеи!

anonymous
()
Ответ на: Словарь от DKorolkov

>def __init__ (self, **preset):

а что означает такая форма записи? то же самое? жаль, у меня не катит (может потому, что у меня 2.3.5?):

result = ModDialog (preset)
TypeError: __init__() takes exactly 1 argument (2 given)

anonymous
()
Ответ на: комментарий от anonymous

> >def __init__ (self, **preset):

> а что означает такая форма записи? то же самое?

Не угадали :). Попробуйте почитать учебник по Python.

result = ModDialog (a=1, b='qwerty', c=[1,2,3])

DKorolkov
()
Ответ на: комментарий от DKorolkov

>Не угадали :)

Вот ведь иногда тупость находит, а ведь мог бы догадаться, что это
неопределённые параметры мапятся в словарь; тем более, что похожей
функцией я уже пользовался:

    def init_treeview (self, data):
        ...
        types = []
        for item in data:
            types.append (item["type"])
        ...
        self.model = gtk.ListStore (*types)
        ...

ещё раз спасибо за подсказки и деликатность :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.