2014-01-02 5 views
0

У меня этот код работает прямо сейчас в моем проекте .....прохождение несколько параметров диспетчер

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

EDIT: Что делать, если я сделал это .....

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

ответ

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) 

но это может быть bett er, чтобы начать использовать класс, чтобы указать контекст:

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) 
+0

он вернулся! что def prepare_args - это то, чего я отсутствовал! ваш ответ в сочетании с объяснением @ jonrsharpe является удивительным. – sirvon

+0

вы можете объяснить немного. Я хотел бы услышать ваши рассуждения. тоже, спасибо. – sirvon

+0

что, если в исходном примере я просто все еще вызывал один параметр, но возвращал несколько значений в функцию геттера ... это будет летать ... pls см. В edit @ bottom of post – sirvon

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} 
+0

Это то, что я видел во всех своих поисках ... но мне трудно найти его в моем конкретном случае. У вас есть время, чтобы пройти через меня ... используя мой конкретный случай? – sirvon

Смежные вопросы