title: Difference between MappingProxyType and PEP 416 frozendict
body: <p>While <code>frozendict</code> <a href="https://www.python.org/dev/peps/pep-0416/#rejection-notice" rel="noreferrer">was rejected</a>, a related class <code>types.MappingProxyType</code> was added to public API in python 3.3.</p>
  
  <p>I understand <code>MappingProxyType</code> is just a wrapper around the underlying <code>dict</code>, but despite that isn't it functionally equivalent to <code>frozendict</code>?</p>
  
  <p>In other words, what's the substantive difference between the original PEP 416 <code>frozendict</code> and this:</p>
  
  <pre><code>from types import MappingProxyType
  def frozendict(*args, **kwargs):
    return MappingProxyType(dict(*args, **kwargs))
  </code></pre>
  
  <p>Of course <code>MappingProxyType</code> is not hashable as is, but just as <a href="https://www.python.org/dev/peps/pep-0416/#recipe-hashable-dict" rel="noreferrer">the PEP suggested for <code>frozendict</code></a>, it can be made hashable after ensuring that all its values are hashable (MappingProxyType cannot be subclassed, so it would be require composition and forwarding of methods).</p>