【问题标题】:Why would unpacking be preffered over passing in a list为什么解包比传入列表更受欢迎
【发布时间】:2012-12-06 00:35:03
【问题描述】:

解包参数列表:

def send(*data):
    for datum in data:
        ser.write(datum)

vs 首先发送列表:

def send(data):
    for datum in data:
        ser.write(datum)

【问题讨论】:

    标签: python parameters arguments parameter-passing iterable-unpacking


    【解决方案1】:

    如果它简化了 API,否则您将总是必须传入一个列表:

    send(something, otherthing)
    

    对比:

    send([something, otherthing])
    

    您的通常参数取自不同位置;例如somethingotherthing 更有可能是单独的变量,而不是已经收集在一个列表中。

    Python 3.x print() 函数和 os.path.join() 函数正是这样做的。在调用 API 之前,您很少将所有打印参数或要加入的路径元素组合在一个列表中。

    比较:

    os.path.join(rootdirectory, relativepath, filename)
    print('Debug information:', localvariable)
    

    对比

    os.path.join([rootdirectory, relativepath, filename])
    print(['Debug information:', localvariable])
    

    如果.join()print() 只接受一个位置参数(一个列表),API 的用户会发现自己一遍又一遍地键入[] 括号。

    通过接受可变数量的位置参数,您的 API 用户可以省去仅为函数调用创建列表的麻烦。在参数已经收集到列表中的极少数情况下,它们可以使用*params 调用约定:

    send(*params)
    

    回显您的函数签名。

    【讨论】:

    • 如果您将[something] 传递给带有 splat 运算符的函数,则列表将被视为单个元素,没有 splat 的函数将在该列表上迭代。你是说有两种不同的用例吗?或者你应该总是使用第一种方式?
    • 它简化了调用,不管元素的数量是多少,只要它们由于其他原因不在列表中。 send(x, '+', y, '=', y + y) 击败 send([x, '+', y, '=', y + y])
    • @HunterMcMillen:改写和扩展;原始版本真的是在叫错树。如果你愿意的话,把它归咎于我家庭办公室的圣诞精神分心。 :-)
    猜你喜欢
    • 2019-06-11
    • 2020-10-25
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2018-08-31
    相关资源
    最近更新 更多