将多个函数传递给类方法

时间:2014-02-10 07:08:09

标签: python function events arguments ironpython

我已在下面定义了TaskTimer类,并且我想在触发事件时执行多个函数,这可能会也可能没有争论。我想提出一种通用的方法来做到这一点。我的功能没有被执行,我没有理解为什么。我在t.start()中的争论是否不正确?

import System  
from System.Timers import (Timer, ElapsedEventArgs)


class TaskTimer(object):

    def __init__ (self):
        self.timer = Timer ()
        self.timer.Enabled = False
        self.handlers =[]

    def On_Timed_Event (self,source, event):

        print 'Event fired', event.SignalTime


        for handler in self.handlers:
            handler(*self.my_args,**self.kwargs)

    def start(self,interval, repeat, *args, **kwargs):

        self.repeat = repeat
        self.run = True                     #True if timer is running
        self.timer.Interval= interval
        self.timer.Enabled = True

        self.my_args= args
        self.kwargs = kwargs


        for x in self.my_args:
            self.handlers.append(x)

        self.timer.Elapsed += self.On_Timed_Event  


def func1(a,b):
    print 'function 1. this function does task1'
    print '1...1...1...'
    return None

def func2(d):
    print 'Function 2. This function does something'
    print '2...2...2...'
    return None 

def func3(a,b,c):
    print 'function 3. This function does something else'
    return None


def main():

    t= TaskTimer()
    D= {'fun2':'func2', 'arg2':'3'}
    t.start(5000,False,func1, func2, func3, a= 1, b=3, c=4, d=D)


if __name__ == '__main__':   
    main()

我正在试验,所以我编辑了def_Timed_Event函数和func1,func2和func3,如下所示。我还根据@Ewan的建议在函数中添加了print语句。 Python会自动替换** self.kwargs中的函数变量吗?

def On_Timed_Event (self,source, event):

    print '\nEvent fired', event.SignalTime

    for handler in self.handlers:
        print 'length of self.handlers', len(self.handlers)
        print 'args', self.my_args
        print 'kwargs', self.kwargs
        print 'handler', handler
        handler(**self.kwargs)
        self.handler[handler](**self.kwargs)

def func1(a,b):
    print 'function 1. this function does task1'
    print 'func1', a,b
    print '1...1...1...'
    return None

def func2(d):
    print 'Function 2. This function does something'
    print 'func2', d
    print '2...2...2...'
    return None 

def func3(a,b,c):
    print 'function 3. This function does something else'
    print 'func3', a,b,c
    return None

代码在IronPyhton控制台中运行。 ![IronPython_console] [2]

  [2]: http://i.stack.imgur.com/vYW0S.jpg

1 个答案:

答案 0 :(得分:0)

首先,我可以看到你在这条线上遇到麻烦:

handler(*self.my_args,**self.kwargs)

由于您未接受kwargsfunc1func2中的任何额外func3,如果达到这些内容,我希望看到以下内容:

In [1]: def func1(a, b):
   ...:     print(a, b)
   ...:

In [2]: kwg = {'a':1, 'b':3, 'c':4, 'd':{'fun2':'func2', 'arg2':'3'}}

In [3]: func1(**kwg)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-12557b6441ce> in <module>()
----> 1 func1(**kwg)

TypeError: func1() got an unexpected keyword argument 'c'

就个人而言,我会在其中放入一些不错的日志/调试语句,以找出程序在堆栈中的位置。

  • 程序是否成功完成或者您是否获得了TraceBack?
  • 这是做什么的:self.timer.Elapsed += self.On_Timed_Event
    • 看起来应该在timer.Elapsed值上添加时间,但self.On_Timed_Event无法返回任何内容
  • On_Timed_Event需要2个参数(source, event),但是您似乎没有传入它们,这也会导致程序失败。
  • 您是否在Event fired中看到stdout,或者该计划是否未到达On_Timed_Event?这可能会在您的System.Timers代码中显示问题。