我之前有过一次错误。 (" NoneType对象不可调用") 我找到了解决问题的方法,而不是调用"更新"直接通过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相比。
答案 0 :(得分:3)
您不需要使用lambda,可以直接传递函数:
t = timer(delta_t_seconds, update)
通过执行timer(delta_t_seconds, update())
(请注意额外的括号),您只需拨打update
一次,然后返回None
。 timer
然后尝试调用None
,这是不可能的(None
不可调用),为您提供遇到的错误。
答案 1 :(得分:1)
使用t = timer(delta_t_seconds, update())
,您将传递返回值(首先调用函数来获取它)而不是函数本身传递给timer
。
如果您想将update
传递给timer
,只需使用t = timer(delta_t_seconds, update)
即可,您无需使用lambda
。
答案 2 :(得分:0)
你不。
update()
不是函数,它是对函数的调用。因此,它在被调用时执行更新。您需要传入一个函数t = timer(delta_t_seconds, update)
。请注意update
之后缺少的括号。
答案 3 :(得分:0)
显然timer
期望第二个参数是可调用的(fx是函数),而函数update
不返回可调用的(实际上它根本不返回任何内容 - 即None
})。 lambda是从表达式创建callable的一种方法(在调用lambda时计算表达式)。请注意,lambda lambda: update()
等同于update
(这是一个函数对象)。