Python восклицательный знак в середине - PullRequest
1 голос
/ 18 января 2020

Вы можете ставить аргументы в виде сплата в середине, а не в конце (кажется, только в 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'

Мой вопрос: существует ли когда-либо, когда-либо , КОГДА-ЛИБО причина для такой вещи?

1 Ответ

0 голосов
/ 18 января 2020

Это позволяет аргументы только для ключевых слов ; аналогично позиционным аргументам (сравнение здесь ).

В идеале, если вам не нужны varargs, вы должны опустить имя, чтобы запретить varargs от предоставления. :

def my_func(a, *, keyword_only=True):
   pass

my_func(1, 2)  # TypeError: my_func() takes 1 positional argument but 2 were given

my_func(1, keyword_only=2)  # Fine
...