title: functools.wrapper - AttributeError: attribute '__doc__' of 'type' objects is not writable
body: <p>While executing the code below, I'm getting <code>AttributeError: attribute '__doc__' of 'type' objects is not writable</code>.</p>
  
  <pre><code>from functools import wraps
  
  def memoize(f):
      """ Memoization decorator for functions taking one or more arguments.
          Saves repeated api calls for a given value, by caching it.
      """
      @wraps(f)
      class memodict(dict):
         """memodict"""
         def __init__(self, f):
             self.f = f
         def __call__(self, *args):
             return self[args]
         def __missing__(self, key):
             ret = self[key] = self.f(*key)
             return ret
       return memodict(f)
  
  @memoize
  def a():
      """blah"""
      pass
  </code></pre>
  
  <p>Traceback:</p>
  
  <pre class="lang-none prettyprint-override"><code>AttributeError Traceback (most recent call last)
  &lt;ipython-input-37-2afb130b1dd6&gt; in &lt;module&gt;()
       17             return ret
       18     return memodict(f)
  ---&gt; 19 @memoize
       20 def a():
       21     """blah"""
  
  &lt;ipython-input-37-2afb130b1dd6&gt; in memoize(f)
        7     """
        8     @wraps(f)
  ----&gt; 9     class memodict(dict):
       10         """memodict"""
       11         def __init__(self, f):
  
  /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.pyc in update_wrapper(wrapper, wrapped, assigned, updated)
       31     """
       32     for attr in assigned:
  ---&gt; 33         setattr(wrapper, attr, getattr(wrapped, attr))
       34     for attr in updated:
       35         getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
  
  AttributeError: attribute '__doc__' of 'type' objects is not writable
  </code></pre>
  
  <p>Even though the doc string is provided, I don't know what's wrong with this.</p>
  
  <p>It's works fine if not wrapped, but I need to do this.</p>