2016-03-06 3 views
2
import re 
import string                  

def buildRule((pattern, search, replace)):           
    return lambda word: re.search(pattern, word) and re.sub(search, replace, word) 1 

def plural(noun, language='en'):        2 
    lines = file('rules.%s' % language).readlines()   3 
    patterns = map(string.split, lines)      4 
    rules = map(buildRule, patterns)       5 
    for rule in rules:          
     result = rule(noun)         6 
     if result: return result 

От: http://www.diveintopython.net/dynamic_functions/stage5.htmlпередавая список функционировать ожидающей кортеж одинаковой длины

Приведенный выше код работает, как ожидалось. Но buildRule ожидает кортеж, но передается список в строке, аннотированной как 5, выше.

Выполняет ли python автоматическое преобразование? Если да, то каково общее правило?

Я искал в Интернете, но не мог получить ничего полезного.

+0

Да, Python автоматически выполняет преобразование; это фактически многозначное назначение, см., например, http://stackoverflow.com/a/29676756/3001761. Обратите внимание, что этот синтаксис [больше не действует в 3.x] (https://docs.python.org/3.0/whatsnew/3.0.html#removed-syntax). – jonrsharpe

+1

BTW, автор также имеет книгу онлайн для Python 3 в [diveintopython3.net] (http://www.diveintopython3.net/). –

+0

@ AnttiHaapala Да, я понял, что после того, как я был более чем на полпути в старую книгу. Я решил закончить то, что начал, потому что новая книга, казалось, была построена совершенно по-другому, поэтому мне пришлось бы начать новую с самого начала. – q126y

ответ

2

Это называется распаковкой параметров tuple. Несмотря на свое название, он работает с любым количеством итераций, имеющим точно столько элементов.

Пакет параметров Tuple был удален из Python в версии 3.0. Причины отсрочки обсуждались в PEP 3113.

Желательно, чтобы вы не использовали этот синтаксис даже в Python 2.


Фактически в этом случае это даже не полезно; buildRule может быть определена как

def buildRule(pattern, search, replace):           
    return lambda word: re.search(pattern, word) and re.sub(search, replace, word) 1 

если линия 5 была заменена

rules = itertools.starmap(buildRule, patterns) 
1

Вы также можете преобразовать список в кортеж. См. Следующий пример.

list_array = [1, 2, 3] 
tuple_array = tuple(list_array) 
Смежные вопросы