2016-10-24 7 views
2

У меня есть этот словарь:Элегантный способ вставки нескольких аргументов

local_commands_dict = { 
    r"\b(listen)\b\s(\d+)": listen_for_connections 
} 

который содержит регулярное выражение, чтобы соответствовать, как ключ и переменную метода в качестве значения. Я использую следующий код для навигации пользовательского ввода, в команду из словаря:

for cmd in local_commands_dict: 
    regex = re.compile(cmd) 
    match = regex.match(data) 
    if match is not None: 
     if regex.groups == 1: 
      local_commands_dict[cmd]() 
     elif regex.groups == 2: 
      local_commands_dict[cmd](match.group(2)) 
     elif regex.groups == 3: 
      local_commands_dict[cmd](match.group(2),match.group(3)) 
        break 

Где data является пользовательским вводом. Есть ли более удобный способ навигации между различными аргументами? Должно быть, это Python.

Спасибо!

ответ

5

В общем, вы можете передать переменное количество аргументов с помощью *:

args = (1, 2) 
func(*args) # Same as func(1, 2) 

Вы можете вызвать .groups() получить все аргументы, и передать их:

local_commands_dict[cmd](*match.groups()) 

Если вы даете имена для ваших групп, то это также работает:

def listen_for_connections(command, amount): 
    pass 

local_commands_dict = { 
    r"\b(?P<command>listen)\b\s(?P<amount>\d+)": listen_for_connections 
} 

local_commands_dict[cmd](**match.groupdict()) 

Теперь совпадение для группы «команда» передается как аргумент «команда», а «сумма» - как «сумма». Таким образом, порядок аргументов функции и порядок групп в регулярном выражении не обязательно должны быть одинаковыми, но вместо этого должны быть имена.

+0

Хорошо, и если бы я хотел отправить только группу '1-n'? где 'n' - максимальное количество групп. Обратите внимание, что 'n' изменяется от команды к команде. – Cybrus

+0

.groups() - это все согласованные группы, поэтому он также изменится с команды на команду, я не понимаю ваш вопрос. – RemcoGerlich

+0

Потому что, если я правильно помню, 'group (0)' всегда является полным совпадением. Который мне не нужно переходить в мою функцию. – Cybrus

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