Проблемы с функцией GetAttr (Python 3) - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть следующее в скрипте Python:

setattr(stringRESULTS, "b", b)

Что дает мне следующую ошибку:

AttributeError: 'str' object has no attribute 'b'

Может кто-нибудь сказать мне, в чем здесь проблема?1007 *

Ответы [ 2 ]

3 голосов
/ 11 февраля 2012

Не делай этого.Процитируем бесценные Грег Хьюгилл ,

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

[Здесь вы на один уровень выше и используете строковую переменную для имени, но это та же основная проблема.] Или, как С. Лотт продолжил в том же потоке:

"90% времени, вы должны использовать словарь. Остальные 10% времени, вам нужно полностью прекратить то, что вы делаете."

Если вы используете содержимое stringRESULTS в качестве указателя на некоторый объект fred, который вы хотите setattr, то эти объекты, на которые вы хотите нацелиться, должны уже где-то существовать, а словарь являетсяестественная структура данных для их хранения.Фактически, в зависимости от вашего варианта использования, вы можете использовать пары ключ / значение словаря вместо атрибутов.

Итак, моя версия того, что (я предполагаю) вы пытаетесь сделать, вероятно, будет выглядеть как

d[stringRESULTS].b = b

или

d[stringRESULTS]["b"] = b

в зависимости от того,Я хотел / нуждался в работе с экземпляром объекта или словаря было бы достаточно.

(PS относительно немногие подписываются на тег python-3.x. Обычно вы получаете больше внимания, добавляя чистый 'python').'tag также.)

0 голосов
/ 11 февраля 2012

Поскольку str является низкоуровневым примитивным типом, вы не можете установить для него произвольный атрибут. Вам, вероятно, нужен либо dict , либо подкласс str :

class StringResult(str):
    pass

, который должен вести себя так, как вы ожидаете:

my_string_result = StringResult("spam_and_eggs")
my_string_result.b = b

EDIT:

Если вы пытаетесь сделать то, что предлагает DSM , т.е. измените свойство переменной, имя которой совпадает со значением переменной stringRESULTS, тогда это должно сработать:

locals()[stringRESULTS].b = b

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

...