我之前有过一次错误 . (“NoneType对象不可调用”)我找到了解决问题的方法,而不是直接调用“update”函数来通过lambda函数调用它 .
代码每秒打印一次开始时间,持续10秒,然后更新打印一次的时间 .
(这是我的更大项目的概念代码证明 . 我使用此构造来创建一个新的时间戳,在该时间戳上打开日志文件 . 而不是在第二天打开旧的日志文件,创建和使用新的日志文件每天00:00:00)
now = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
delta_t_seconds = 10
def update():
global now
now = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print "Time updated"
return
t = timer(delta_t_seconds, lambda: update())
t.start()
while (True):
print("Time is:" + now)
time.sleep(1)
我的问题是:为什么我必须通过lambda函数调用它?
t = timer(delta_t_seconds, lambda: update())
而不是直接:
t = timer(delta_t_seconds, update())
调用function2似乎很愚蠢,其唯一目的是调用function1 . 与直接调用function1相比 .
4 回答
你不需要使用lambda,你可以直接传递函数:
通过执行
timer(delta_t_seconds, update())
(注意额外的括号),您调用update
一次,返回None
.timer
然后尝试调用None
,这是不可能的(None
不可调用),给你所遇到的错误 .使用
t = timer(delta_t_seconds, update())
,您将传递返回值(首先调用函数以获取它)而不是函数本身传递给timer
.如果要将
update
传递给timer
,只需使用t = timer(delta_t_seconds, update)
,则不需要使用lambda
.You don't .
update()
isn 't a function, it'是对函数的调用 . 因此,它在被调用时执行更新 . 你需要传入一个函数,它将是t = timer(delta_t_seconds, update)
. 请注意update
之后缺少的括号 .显然
timer
期望第二个参数是可调用的(fx是函数),而函数update
不返回可调用的(实际上它根本不返回任何内容 - 即None
) . lambda是从表达式创建callable的一种方法(在调用lambda时计算表达式) . 请注意,lambdalambda: update()
等效于update
(这是一个函数对象) .