Python 将多个函数传递给类方法

Python 将多个函数传递给类方法,python,function,events,arguments,ironpython,Python,Function,Events,Arguments,Ironpython,我在下面定义了TaskTimer类,我希望在触发事件时执行多个函数,这些函数可能有参数,也可能没有参数。我想提出一个通用的方法来做这件事。我的功能没有被执行,我不理解为什么。我在t.start()中的论点是否不正确 import System from System.Timers import (Timer, ElapsedEventArgs) class TaskTimer(object): def __init__ (self): self.timer =

我在下面定义了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_事件函数和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
代码在IronPyton控制台中运行。 ![铁人台][2]

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

首先,我可以看到您在这一行遇到了问题:

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

由于您在
func1
func2
func3
中不接受任何额外的
kwargs
,因此,如果达到他们的要求,我希望看到以下内容:

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'
[1]中的
:定义函数1(a,b):
…:打印(a,b)
...:
在[2]中:kwg={'a':1,'b':3,'c':4,'d':{'fun2':'func2','arg2':'3'}
在[3]中:func1(**kwg)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1职能1(**kwg)
TypeError:func1()获得意外的关键字参数“c”
就我个人而言,我会加入一些不错的日志记录/调试语句,以找出程序在堆栈中的位置

  • 程序是否成功完成,或者您是否得到回溯
  • 这是设计用来做什么的:
    self.timer.appeased+=self.On\u Timed\u事件
    • 它看起来应该是在您的
      计时器上添加一个时间。已用
      值,但是
      self.On\u Timed\u事件
  • On_Timed_Event
    接受2个参数(
    源,事件
    ),但是您似乎没有传入它们,这也会导致程序失败
  • 您是否在
    标准输出中看到触发了
    事件
    ,或者程序根本无法在事件
    上启动
    ?这可能表明您的
    系统中存在问题。计时器
    代码

您希望如何执行
self.timer.appeased+=self.On\u Timed\u Event
事件?@jornsharpe应该在On\u Timed\u Events中执行代码。它正在部分地执行,但是我在执行函数时遇到了问题。我想将任意数量的函数传递给TaskTimer。我将编辑我的问题以提供更多细节。我遵照您的建议,在函数中添加了打印语句。但是,参数似乎没有传递到函数中。Python是否应该使用**self.kwargs生成参数替换?代码运行iside IronPython控制台。我试图添加一个控制台的图像,但它确实有效。谢谢你的评论。看来我必须修改func1、func2和func3的参数列表,以包含**kwargs。