28

我必须在网络课程中编写一个类似于选择性重复但需要计时器的程序。在谷歌搜索后,我发现 threading.Timer 可以帮助我,我编写了一个简单的程序来测试 threading.Timer 是如何工作的:

import threading

def hello():
    print "hello, world"

t = threading.Timer(10.0, hello)
t.start() 
print "Hi"
i=10
i=i+20
print i

该程序运行正常。但是当我尝试以提供如下参数的方式定义 hello 函数时:

import threading

def hello(s):
    print s

h="hello world"
t = threading.Timer(10.0, hello(h))
t.start() 
print "Hi"
i=10
i=i+20
print i

输出是:

hello world
Hi
30
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 726, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable

我不明白是什么问题!谁能帮我?

4

2 回答 2

62

您只需要将参数hello放入函数调用中的单独项目中,如下所示,

t = threading.Timer(10.0, hello, [h])

这是 Python 中常用的方法。否则,当您使用 时Timer(10.0, hello(h)),此函数调用的结果将传递给TimerNone因为hello不会显式返回。

于 2013-05-16T03:50:59.033 回答
2

lambda如果您想使用普通函数参数,另一种方法是使用。基本上它告诉程序参数是一个函数,而不是在赋值时调用。

t = threading.Timer(10.0, lambda: hello(h))
于 2020-10-26T07:46:28.390 回答