Python threading.Timer()

Python threading.Timer(),python,python-2.7,Python,Python 2.7,我必须在网络课程中编写一个程序,它类似于选择性重复,但需要一个计时器。在google中搜索后,我发现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 这个程序运行

我必须在网络课程中编写一个程序,它类似于选择性重复,但需要一个计时器。在google中搜索后,我发现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
我不明白是什么问题!
有人能帮我吗?

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

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

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

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

t = threading.Timer(10.0, lambda: hello(h))