<p>python中的Dictionary基本上是一个实现<a href="https://docs.python.org/3.2/reference/datamodel.html#emulating-container-types" rel="nofollow">few methods</a>的类,对您来说可能很重要:</p>
<ul>
<li><a href="https://docs.python.org/3.2/reference/datamodel.html#object.__contains__" rel="nofollow">^{<cd1>}</a></li>
<li><a href="https://docs.python.org/3.2/reference/datamodel.html#object.__getitem__" rel="nofollow">^{<cd2>}</a></li>
<li><a href="https://docs.python.org/3.2/reference/datamodel.html#object.__setitem__" rel="nofollow">^{<cd3>}</a></li>
<li><a href="https://docs.python.org/3.2/reference/datamodel.html#object.__delitem__" rel="nofollow">^{<cd4>}</a></li>
</ul>
<p>基本上你只想让他们把每一个键都编码成字节,如果还没有的话,比如:</p>
<pre><code>if isinstance(key, str):
return key.encode('utf-8')
return key
</code></pre>
<p>因此,您只需将默认字典包装到自己的字典中:</p>
<pre><code>class SDict(dict):
@staticmethod
def prepare_key(key):
if isinstance(key, str):
return key.encode('utf-8')
return key
def __contains__(self, key):
return super().__contains__(self.prepare_key(key))
def __getitem__(self, key):
return super().__getitem__(self.prepare_key(key))
def __setitem__(self, key, value):
return super().__getitem__(self.prepare_key(key), value)
def __delitem__(self, key):
return super().__delitem__(self.prepare_key(key))
</code></pre>
<p>您可以从公共<code>dict</code>对象初始化它:</p>
<pre><code>>>> d1 = {b'a': 1, b'b': 2}
>>> d2 = SDict(d1)
>>> d2
{b'a': 1, b'b': 2}
</code></pre>
<p><code>in</code>运算符工作正常:</p>
<pre><code>>>> 'a' in d1
False
>>> 'a' in d2
True
>>> 'c' in d2
False
>>> 'c' in d1
False
</code></pre>
<p>项目选择也适用于:</p>
<pre><code>>>> d1['a']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'a'
>>> d1[b'a']
1
>>> d2[b'a']
1
>>> d2['a']
1
</code></pre>