目前我在python中遇到错误,但我似乎无法找到它们
def dictionaryObjectParsed():
a = []
b = []
a, b = zip(*(map(lambda x: x.rstrip('\n\r').split('\t'), open('/Users/settingj/Desktop/NOxMultiplier.csv').readlines())))
for x in range(0,len(a)):
print a[x]
print b[x]
def timer(f):
threading.Timer(1, timer, f).start()
print time.strftime('%I:%M:%S %p %Z')
timer(dictionaryObjectParsed)
这是我得到的错误
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 756, in run
self.function(*self.args, **self.kwargs)
TypeError: timer() argument after * must be a sequence, not function
我之前能够做到这一点,但我认为我做了一些事情来创造这个错误,那是什么:(
我显然正在将参数传递给计时器功能......对吗?
修改
我也试过timer(dictionaryObjectParsed)
,但没有......
另外,对于noobie问题感到抱歉这只是我在python中的第二天......:P
答案 0 :(得分:3)
传递函数而不调用它(放下'()')..
timer(dictionaryObjectParsed)
和
def timer(f):
threading.Timer(1,f).start()
print time.strftime('%I:%M:%S %p %Z')
而不是
threading.Timer(1,timer)
我试图错误地创建一个递归计时器功能。你得到的错误是再次调用函数'timer'而没有函数参数。我认为这是一个简单的错误。
好的,所以你确实想要一个递归函数,所以试试这个:
def timer(f):
threading.Timer(1,timer,[f,]).start()
f()
print time.strftime('%I:%M:%S %p %Z')
工作?
答案 1 :(得分:0)
您有多处错误。
试试这个:
def timer(f):
f() # NOTE THIS NEW LINE
threading.Timer(1,timer, f).start() # NOTE CHANGE ON THIS LINE
print time.strftime('%I:%M:%S %p %Z')
timer(dictionaryObjectParsed) # NOTE CHANGE ON THIS LINE
请注意,在最后一行,您要传递函数,而不是调用函数的结果。
请注意,在threading.Timer ...
行上,您希望传递足够的参数,以便timer()
的后续调用具有正确的args数。
注意新行 - 没有它,永远不会调用dictionaryObjectParsed
!
答案 2 :(得分:0)
实例化Timer Instance的实际语法是
threading.Timer(interval, function, args=[], kwargs={})
您的实施中存在两个问题
我相信,你的意图是注册函数参数而不是调用函数。这最终会将您的实现改为
def timer(f):
threading.Timer(1,f).start()
print time.strftime('%I:%M:%S %p %Z')
但由于一些奇怪的原因,你想注册调用函数,你还需要将参数作为参数传递给threading.Timer,符合文档中的语法
def timer(f):
threading.Timer(1,timer, f).start()
print time.strftime('%I:%M:%S %p %Z')