<p>这是因为你没有正确地复制函数。如果您查看<code>types.FunctionType</code>的签名,您将看到它接受5个参数:</p>
<pre><code>class function(object)
| function(code, globals, name=None, argdefs=None, closure=None)
|
| Create a function object.
|
| code
| a code object
| globals
| the globals dictionary
| name
| a string that overrides the name from the code object
| argdefs
| a tuple that specifies the default argument values
| closure
| a tuple that supplies the bindings for free variables
</code></pre>
<p>您没有传递任何<code>argdefs</code>,因此函数不再具有可选参数。复制函数的正确方法是</p>
<pre><code>types.FunctionType(f.__code__,
{},
f.__name__,
f.__defaults__,
f.__closure__
)
</code></pre>
<hr/>
<p>然而,这导致了另一个问题:切断对globals的访问也切断了对内置的访问。如果您尝试使用<code>print</code>或<code>open</code>或<code>dict</code>或类似的<code>myFunction</code>,您将得到<code>NameError</code>。因此,编写decorator的正确方法是:</p>
<pre><code>import builtins
import types
def noglobal(f):
return types.FunctionType(f.__code__,
{'__builtins__': builtins},
f.__name__,
f.__defaults__,
f.__closure__
)
</code></pre>