将函数传递给函数

时间:2013-08-13 17:35:30

标签: python function timer

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

3 个答案:

答案 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={})

您的实施中存在两个问题

  1. 您正在注册一个接受1个参数的函数,而不会将任何参数传递给您的注册函数
  2. 您在计时器例程中递归注册调用函数。
  3. 我相信,你的意图是注册函数参数而不是调用函数。这最终会将您的实现改为

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