Это потому, что вы неправильно скопировали функцию.Если вы посмотрите на подпись types.FunctionType
, то увидите, что она принимает 5 аргументов:
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
Вы не передали argdefs
, поэтому у функции больше нет необязательных аргументов,Правильный способ копирования этой функции -
types.FunctionType(f.__code__,
{},
f.__name__,
f.__defaults__,
f.__closure__
)
Однако , это приводит к другой проблеме: ограничение доступа к глобальным переменным также отключает доступ к встроенным функциям.Если вы попытаетесь использовать print
или open
или dict
или что-то подобное в myFunction
, вы получите NameError
.Итак, действительно правильный способ написать ваш декоратор таков:
import builtins
import types
def noglobal(f):
return types.FunctionType(f.__code__,
{'__builtins__': builtins},
f.__name__,
f.__defaults__,
f.__closure__
)