2014-09-03 2 views
1
def func(*v, **k): pass 
func(**{'a': 1}, *(1, 2, 3))  # ERROR... 
func(a=1, *(1, 2, 3))   # OK... 

Я не понимаю, почему это первое не работает, а второе делает.Смешивание * vargs и ** kargs аргументы в вызове функции

Кто-то может просто сказать «потому что реализация говорит так», но я также хотел бы знать , почему реализация говорит так. Не удалось ли реализовать перевод первого ко второму, чтобы заставить этот вызов работать?

+0

Вторыми работает только тогда, когда 'a', является четвёртым определенным параметром. – chepner

+0

Вы можете использовать 'func (* (1, 2, 3), ** {'a': 1})'. В грамматике просто указывается, что '* args' идет до' ** kwargs'. Зачем? Потому что это не имеет значения, поэтому они просто выбрали один заказ. –

+0

@SvenMarnach Mmmmh .... Не существует ли за этим решением проблемы с производительностью? – zer0uno

ответ

1

первая, вторая строка работает только в том случае, если параметр a является последним (четвертым). например, следующий код не будет работать:

def func(a,b,c,d): 
    pass 

func(a=1, *(1, 2, 3)) 

И вам вопрос, я думаю, что проблема с первой строкой:

func(**{'a': 1}, *(1, 2, 3)) 

является то, что вы можете иметь несколько значений для того же параметра этого путь, если словарь содержит один из первых трех параметров.

разница в том, что словарь может быть переменным и имеет разное значение на разных прогонах так что этот код всегда считается незаконным

+0

'func (* (1, 2, 3), ** {'a': 1}' разрешено, поэтому аргументация, вероятно, не была тем, что вы догадались. –

+0

интересно, спасибо. Так что, возможно, потому что это будет не ясно что 'a' является последней переменной, если вы положите ее в начале или, может быть, просто потому, что порядок параметров важен, как и каждый раз, когда вы вызываете функцию, и * vargs должны быть до ** kargs (edit: теперь я видел, что вы уже писали это в комментарии ..) – Elisha

1

Передача позиционных реплик и аргументов ключевых слов, подобных этому, является частью синтаксиса языка, а не функцией времени выполнения. То есть *(1,2,3) не просто создает специальный объект, который передается функции, когда он вызывается, а «как-то» используется для назначения значений определенным параметрам. Таким образом, разрешение такой гибкости при заказе будет стоить значительно усложнить синтаксический анализатор без реальной выгоды.

Смежные вопросы