2011-01-20 2 views
2

У меня есть пользовательская реализация dict, которая переопределяет и по большому счету поддерживается родным Python dict. Однако при настройке он выполняет некоторую предварительную обработку значения и сохраняет его в каком-то собственном объекте. При получении этот проприетарный объект затем преобразуется в более естественный формат.Обновление Python Dict от пользовательского Dict

Все функции, вызываемые из этого пользовательского dict, ведут себя так, как мне нравится.

Проблема заключается в том, что когда вы вызываете что-то вроде {'a': 1} .update (custom_dict ({'b': 2})), значение для 'b' в обновленном dict является собственностью внутреннего хранилища объект, а не обработанное значение.

Как работает обновление для коренного языка Python. Я переопределил все методы, которые я мог придумать, используя items, iteritems, values, itervalues, get и __getitem__, но я, похоже, не прибил ни одно из обновлений, которое пытается получить доступ, что заставляет меня поверить может использовать код c. Мысли?

--Update--

Я только что нашел это в исходном коде Python:

if (PyDict_Check(b)) { 
    ... 
} 
else { 
    /* Do it the generic, slower way */ 
    ... 
} 

Возможно, это ошибка, и что должно быть PyDict_CheckExact(b) как показывает в различных других местах в код.

Любая идея, как победить эту проверку?

+0

Наследовать ли вы от 'dict'? Может быть, это не поможет. Похоже, вы все равно не используете много функциональности 'dict'. – 9000

+0

Да, я унаследовал от dict. В основном все методы, которые я переопределил, явно вызывают методы dict .__ после некоторой обработки. Я полагал, что альтернатива иметь вспомогательный dict и использование абстрактного базового класса будет хуже ... –

ответ