В версиях, предшествующих Python 3.7, CPython имеет ограничение в 255 явно переданных аргументов при вызове:
>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
SyntaxError: more than 255 arguments
Это ограничение действует, поскольку до Python 3.5 опкод CALL_FUNCTION
перегружал аргумент опкода для кодирования как количества позиционных, так и ключевых аргументов в стеке, каждый из которых был закодирован в один байт.
Это ограничение будет снято в следующем выпуске Python 3.7, см. проблемы # 27213 и проблемы # 12844 ; # 27213 переработал семейство кодов операций CALL_FUNCTION*
для повышения производительности и простоты (часть 3.6), освободив аргумент кода операции для кодирования только одного аргумента, и # 12844 удалил проверку во время компиляции, которая препятствовала использованию кода с большим количеством аргументов скомпилирован.
В 3.7 с опкодом EXTENDED_ARG()
теперь вообще нет ограничения на то, сколько аргументов вы можете передать с использованием явных аргументов, за исключением того, сколько можно подогнать в стек (теперь он связан вашей памятью):
>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=7, micro=0, releaselevel='alpha', serial=2)
>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
>>> exec("f({})".format(', '.join(map(str, range(2 ** 16)))))
Обратите внимание, что списки, кортежи и словари ограничены sys.maxsize
элементами, поэтому, если вызываемая функция использует параметры *args
и / или **kwargs
catch-all, тогда эти ограничено.
Для синтаксиса вызовов *args
и **kwargs
(расширяющие аргументы) нет никаких ограничений, кроме тех же ограничений размера sys.maxint
для стандартных типов Python.