将多个参数传递给调度程序

时间:2014-01-02 10:59:56

标签: python design-patterns

我现在正在我的项目中运行此代码.....

  def newChannel(cName):
      queue = j.queue(cName)
      r = queue.add_subscribers(*[subscriberCreateChanTable, subscriberSortScenes])

  def newNetwork(hName):
     queue = j.queue(hName)
     r = queue.add_subscribers(*[subscriber1a])

  def loginError(nName):
     pass

  def hName(ok):
     return ok[11][1]

  def cName(ok):
     return ok[12][1]

  def nName(ok):
     return ok[10][1]

  def eventType(ok):
     return ok[9][1]


  action = {
     'newChannel': (newChannel, cName),
     'newNetwork': (newNetwork, hName),
     'loginError': (loginError, nName)
     }

如何调整它以接受多个参数?

  def newChannel(cName, hname, time):
      queue = j.queue(cName)
      r = queue.add_subscribers(*[subscriberCreateChanTable, subscriberSortScenes, hname])
      rd = time

  action = {
     'newChannel': (newChannel, cName, ??, ??),
     'newNetwork': (newNetwork, hName, ??),
     'loginError': (loginError, nName)
     }

   ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
   handler, getter  = action.get(eventType(ok))
   handler(getter(ok))???

编辑: 如果我这样做会怎么样.....

         def cName(ok):
             return ok[9][1]
             return ok[12][1]
             return ok[8][1]

         action = {
         'newChannel': (newChannel, cName)
         }

         ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
         handler, getter  = action.get(eventType(ok))
         handler(getter(ok))

2 个答案:

答案 0 :(得分:1)

又快又脏:

def prepare_args(ok, *args):
    return [arg(ok) if callable(arg) else arg for arg in args]

action = {
    'newChannel': (newChannel, (cName, hName, whatever,),
    'newNetwork': (newNetwork, (hName,)),
    'loginError': (loginError, (nName,))
    }

ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
handler, args  = action.get(eventType(ok))
args = prepare_args(ok, *args)
handler(*args)

但是开始使用类来提供上下文可能会更好:

class QueryHandler(object):
    def __init__(self, u):
        self.ok = parse_qsl(urlparse(u).query, keep_blank_values=True)

    def newNetwork(self):
         queue = j.queue(self.hName)
         r = queue.add_subscribers(subscriber1a)

    def newChannel(self):
          queue = j.queue(self.cName)
          r = queue.add_subscribers(
              subscriberCreateChanTable,
              subscriberSortScenes,
              self.hname
              )
          rd = self.time

    def loginError(self):
        pass


    @property
    def time(self):
        return whatever_time_is_supposed_to_be

    @property
    def hName(self):
        return self.ok[11][1]

    @property
    def cName(self):
        return self.ok[12][1]

    @property
    def nName(self):
        return self.ok[10][1]

    @property
    def eventType(self):
        return self.ok[9][1]


    actions = {
        'newChannel': newChannel,
        'newNetwork': newNetwork,
        'loginError': loginError,
        }

    def dispatch(self):
        handler  = self.actions.get(self.eventType)
        handler(self)

答案 1 :(得分:0)

Python中任意参数的语法是:

def func(*args, **kwargs):
    print(args) # positional
    print(kwargs) # keyword

*用于元组(un)打包位置参数,**用于字典un(打包)关键字参数。例如:

>>> func(1, 2, x=3, y=4)
(1, 2)
{'x':3, 'y':4} # not necessarily in that order

您可以将其与指定的位置和关键字参数结合使用:

def func2(pos1, *args, kw1="3", **kwargs):
    print(pos1)
    print(args)
    print(kw1)
    print(kwargs)

会给出:

>>> func2(1, 2, kw2=4)
1
(2,)
3
{'kw2': 4}