Timer(superMegaIntenseFunction(10))
означает «вызов superMegaIntenseFunction(10)
, а затем передача результата в Timer
».Это явно не то, что вы хотите.Timer
ожидает либо вызываемого объекта (так же, как это звучит: что-то, что может быть вызвано, например, функцию), либо строку (чтобы она могла интерпретировать содержимое строки как код Python)Timer
работает, повторно вызывая вызываемую вещь и наблюдая, сколько времени уходит.
Timer(superMegaIntenseFunction)
пройдет проверку типа, потому что superMegaIntenseFunction
вызывается.Однако, Timer
не будет знать, какие значения передать superMegaIntenseFunction
.
Простой способ обойти это, конечно, - использовать строку с кодом.Нам нужно передать аргумент 'setup' в код, потому что строка «интерпретируется как код» в новом контексте - у нее нет доступа к тому же globals
, поэтому вам нужно запустить еще один бит кода длясделать определение доступным - см. ответ @ oxtopus.
С помощью lambda
(как в ответе @ Pablo) мы можем связать параметр 10
с вызовом superMegaIntenseFunction
.Все, что мы делаем, это создаем другую функцию, которая не принимает аргументов и вызывает superMegaIntenseFunction
с 10
.Это похоже на то, как если бы вы использовали def
для создания другой подобной функции, за исключением того, что новая функция не получает имя (потому что оно ей не нужно).