Странная распаковка пользовательского словаря / сопоставления в Jython

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

import collections

class CustomMapping(collections.MutableMapping):
    def __init__(self):
        self.storage = {}

    def __setitem__(self, key, value):
        self.storage[key] = value

    def __getitem__(self, key):
        print('Accessed CustomMapping instance for key %s' % key)
        return self.storage[key]

    def __delitem__(self, key):
        del self.storage[key]

    def __len__(self):
        return len(self.storage)

    def __iter__(self):
        for key in self.storage:
            yield key

    def __str__(self):
        return str(self.storage)

И теперь я запускаю этот тестовый код:

print(dict(
    name='test', _some_stuff='abc', more='def', **CustomMapping())
)

В Python 2.7 я получаю то, что ожидал:

{'more': 'def', '_some_stuff': 'abc', 'name': 'test'}

Но в Jython 2.7.0 я получаю это:

Доступ к экземпляру CustomMapping для имени ключа

Получил доступ к экземпляру CustomMapping для ключа _some_stuff

Доступ к экземпляру CustomMapping для ключа больше

{'more': 'def', '_some_stuff': 'abc', 'name': 'test'}

Установка точки останова в отладчике также подтверждает, что во время распаковки __getitem__ метод CustomMapping Доступ к экземпляру осуществляется для каждого ключа во внешнем словаре. Это очень озадачивает, случается только в Jython и выглядит для меня как ошибка. Хотя приведенный выше пример использует dict в качестве внешней функции подойдет любая другая функция.

Я надеюсь, что кто-то может пролить свет на это поведение. В моем реальном контексте это вызывает неприятное поведение в моем приложении на основе SQLAlchemy. Любая помощь с благодарностью.

0 ответов

Другие вопросы по тегам