【问题标题】:passing list to function expecting tuple of same length将列表传递给期望相同长度的元组的函数
【发布时间】:2016-06-20 03:30:20
【问题描述】:
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 会自动进行转换吗?如果是,那么一般规则是什么?

我在网上搜索过,但找不到任何有用的东西。

【问题讨论】:

  • 是的,Python 会自动进行转换;它实际上是一个多值赋值,参见例如stackoverflow.com/a/29676756/3001761。请注意,此语法为no longer valid in 3.x
  • 顺便说一句,作者在diveintopython3.net也有一本书在线Python 3。
  • @AnttiHaapala 是的,在我读到旧书的一半以上之后,我意识到这一点。我决定完成我开始的那本,因为新书的结构似乎完全不同,所以我不得不从头开始。

标签: python list type-conversion tuples python-2.x


【解决方案1】:

这称为元组参数解包。尽管有它的名字,但它适用于任何类型的具有那么多元素的迭代。

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

【讨论】:

    【解决方案2】:

    您还可以将列表转换为元组。请参阅以下示例。

    list_array = [1, 2, 3]
    tuple_array = tuple(list_array)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-10-09
      • 1970-01-01
      相关资源
      最近更新 更多