1

目前我在 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

4

3 回答 3

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')

工作了吗?

于 2013-08-13T17:37:34.187 回答
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()具有正确数量的参数。

注意新行——没有它,dictionaryObjectParsed永远不会被调用!

于 2013-08-13T17:45:02.407 回答
0

实例化Timer 实例的实际语法是

threading.Timer(interval, function, args=[], kwargs={})

您的实施中有两个问题

  1. 您正在注册一个接受 1 个参数的函数,而没有将任何参数传递给您的注册函数
  2. 您正在计时器例程中递归地注册调用者函数。

我相信,您的意图是注册函数参数而不是调用者函数。这最终会将您的实现更改为

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')
于 2013-08-13T17:47:14.467 回答