Python splat-in-the-middle

问题描述 投票:1回答:1

可以将splat参数放在中间而不是最后(似乎仅在python 3中:]]

import functools
def wierd_sum(use_str_cat=False, *args, use_product=False):
    if use_str_cat:
        return ''.join([str(a) for a in args])
    elif use_product:
        return functools.reduce(lambda a,b : a*b, args)
    else:
        return functools.reduce(lambda a,b : a+b, args) 

现在如何使用所说的功能?

print(wierd_sum(1, 2, 3)) # 23  -> Concatenation, 1 counts as True.
print(wierd_sum(False, 2, 3, 4, 5, True)) # 15 -> Addition, True counts as 1.
print(wierd_sum(False, 2, 3, 4, 5, use_product=True)) # 120 -> Multiplication 2*3*4*5
print(wierd_sum(use_str_cat=True, 1, 2, 3)) # SyntaxError: positional argument follows keyword argument.
print(wierd_sum(1, 2, 3, use_str_cat=False)) # TypeError: wierd_sum() got multiple values for argument 'use_str_cat'

我的问题是,有[EVER做这种事情的理由吗?

您可以将splat参数放在中间而不是结尾(似乎仅在python 3中:导入functools def wierd_sum(use_str_cat = False,* args,use_product = False):如果use_str_cat:...
python-3.x variadic-functions arity
1个回答
0
投票
这是为了允许keyword only arguments;类似于positional-only arguments(比较here)。

但是理想情况下,除非您实际需要varargs,否则应省略名称以禁止提供varargs:

© www.soinside.com 2019 - 2024. All rights reserved.