如何从传入带参函数的函数中返回值?遇TypeError报错
问题解决:TypeError: 'NoneType' object is not callable
错误原因
你当前的写法是先执行了runner函数,再把返回值传给计时函数:
time_elapsed = get_running_time(runner(x:int, y:int, z:int, return_values:list))
Python会优先计算括号里的runner(...),如果runner没有显式返回值,它的返回值就是None。而get_running_time期望接收一个可调用的函数,拿到None后调用fn()自然会报错。
解决方案
以下三种方法都可以解决问题,按需选择:
方法1:用lambda包装带参调用
把带参数的runner调用包装成无参的lambda函数,这样传给计时函数的是可调用对象:
time_elapsed = get_running_time(lambda: runner(x, y, z, return_values))
方法2:改造计时函数支持传参
直接修改get_running_time,让它能接收函数和对应的参数,使用更灵活:
import time from typing import Callable, Any def get_running_time(fn: Callable, *args, **kwargs): time_start = time.time() fn(*args, **kwargs) # 传递所有位置参数和关键字参数 return time.time() - time_start # 调用示例 time_elapsed = get_running_time(runner, x, y, z, return_values=return_values)
方法3:用functools.partial绑定参数
如果需要复用绑定好参数的runner,可以用functools.partial:
from functools import partial # 绑定参数到runner bound_runner = partial(runner, x, y, z, return_values=return_values) # 传入计时函数 time_elapsed = get_running_time(bound_runner)
补充说明
你用列表return_values按引用传递获取结果的方式完全没问题,不会对计时逻辑产生影响。
内容的提问来源于stack exchange,提问作者Tim Korelov
相关产品推荐
相关产品推荐

