Получить словарь в Python для хранения объектов примитивного типа (место в памяти) вместо значения этих объектов? - PullRequest
0 голосов
/ 02 ноября 2011

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

Т.е.

    location_dict = {
    'dorm_common':newnom.dorm_common,
    'cafeteria':newnom.cafeteria,
    'comp_room':newnom.comp_room}

Я хочу выполнить итерацию подиктовать и менять newnom.comp_room = True.Проблема в том, что в словаре хранится значение по умолчанию newnom.comp_room, которое равно None, поэтому я не могу установить newnom.comp_room.

Я могу придумать множество способов обойти это, например, сделатьnewnom.comp_room "newnom.comp_room" и использование exec (v + 'True') или переход к

    (newnom.__dict__()[k] = True)

, но мне было интересно, есть ли другой способ переопределить это поведение по умолчанию в словаре Python.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

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

Измените свой дизайн так, чтобы (в порядке возрастания темноты) ...

  • Вы только сохраняете объект, и получаете доступ / изменяете различные атрибуты другими способами (например, с помощью getattr / setattr, или с помощью специального метода с проверкой, чтобы ограничить динамическую ползучесть и аварии - может даже сделать newnom),Я действительно рекомендую это.На сегодняшний день это самый простой и наименее удивительный подход.
  • Вы можете перейти от значения dict к объекту и напрямую изменить атрибут (например, сохранить кортеж (объект, имя атрибута): (newnom, 'dorm_common')).
  • location_dict на самом деле не диктат, а объект, поддерживающий некоторые словарные операции и направляющий их на манипулирование newnom.(Я бы порекомендовал такую ​​хакерскую работу, если у вас есть тонна устаревшего кода, для которого требуется внешний словарь).
0 голосов
/ 03 ноября 2011

Что вы можете сделать, попробуйте использовать прокси-объект, который содержит значение, которое вы хотите изменить:

class MutableProxy(object):
    __slots__ = "value"
    def __init__(self, value):
        self.value = value

    def get(self):
        return self.value

    def set(self, value):
        self.value = value

Затем вы можете использовать функции get() и set() для установки фактических значений, например:

>>> var_1 = MutableProxy(100)
>>> var_1.get()
100
>>> d = { "var_1" : var_1 }
>>> d["var_1"].set(600)
>>> var_1.get()
600

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...