Какое максимальное количество аргументов может быть у функции в Python?
У всех на слуху, что в Python функции могут иметь максимум 256 аргументов. Мне интересно, распространяется ли этот лимит на аргументы, передаваемые через *args
и **kwargs
, когда они распаковываются следующим образом:
items = [1, 2, 3, 4, 5, 6]
def do_something(*items):
pass
Я спрашиваю, потому что гипотетически могут возникнуть случаи, когда список, содержащий более 256 элементов, будет распакован в виде набора *args
или **kwargs
.
2 ответ(ов)
Для **kwargs
, если я правильно помню, это словарь. Соответственно, у него почти нет ограничений.
Что касается *args
, я не уверен на 100%, но, похоже, это кортеж или список, так что также можно сказать, что ограничений нет.
Под «почти нет ограничений» я подразумеваю, что единственное ограничение - это, возможно, объем доступной памяти.
В вашем коде вы создали функцию с 5000 аргументами и успешно использовали её с помощью вызова f(*range(5000))
. Тем не менее, при попытке вызвать функцию с 5000 аргументами через exec
вы столкнулись с ошибкой SyntaxError: more than 255 arguments
. Это связано с тем, что ограничение на количество аргументов применяется только на стороне вызова, когда вы используете строковую интерполяцию для создания вызова функции.
Проблема возникает потому, что часть exec 'f(' + ','.join(str(i) for i in range(5000)) + ')'
формирует строку, которая содержит больше 255 аргументов в одном вызове. Python накладывает это ограничение на строковые выражения.
Таким образом, ваш вывод f(*range(5000))
работает, потому что передача аргументов происходит в развернутом виде, и это ограничение не применяется.
Итог: Ограничение на количество аргументов действительно имеет место, но оно относится к "развернутым" вызовам и строковым выражениям, а не к передаче аргументов через распаковку.
Декораторы с параметрами?
Установка значения по умолчанию для параметра функции в JavaScript
Как получить исходный код функции Python?
Почему у некоторых функций есть двойные подчеркивания "__" перед и после имени функции?
Следует ли добавлять запятую после последнего аргумента в вызове функции? [закрыто]