Python Jython中自定义字典/映射的奇怪解包
我在Jython中遇到了一个奇怪的字典/映射解包行为。最初,在SQLAlchemy的上下文中,但我设法将其缩小到以下最小示例:Python Jython中自定义字典/映射的奇怪解包,python,python-2.7,jython,argument-unpacking,Python,Python 2.7,Jython,Argument Unpacking,我在Jython中遇到了一个奇怪的字典/映射解包行为。最初,在SQLAlchemy的上下文中,但我设法将其缩小到以下最小示例: import collections class CustomMapping(collections.MutableMapping): def __init__(self): self.storage = {} def __setitem__(self, key, value): self.storage[key] =
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中,我得到了我所期望的:
但在Jython 2.7.0中,我发现:
已访问密钥名称的CustomMapping实例
已访问密钥\u某些\u内容的CustomMapping实例
已访问密钥更多的CustomMapping实例
{'more': 'def', '_some_stuff': 'abc', 'name': 'test'}
在调试器中设置断点还可以确认,在解包过程中,CustomMapping
实例的\uuuu getitem\uuuu
方法对于外部字典中的每个键都是可访问的。这是非常令人费解的,只发生在Jython,在我看来就像一个虫子。虽然上面的示例使用dict
作为外部函数,但任何其他函数都可以
我希望有人能解释这种行为。在我的真实环境中,这在我的SQLAlchemy驱动的应用程序中导致了一些令人讨厌的行为。非常感谢您的帮助
{'more': 'def', '_some_stuff': 'abc', 'name': 'test'}