CPython tiene un límite de 255 argumentos pasados explícitamente en una llamada:
>>> 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
Esta limitación está en su lugar porque hasta Python 3.5, el CALL_FUNCTION
opcode sobrecargado el argumento opcode para codificar tanto la. número de argumentos posicionales y de palabra clave en la pila, ambos codificados en un solo byte.
Esta limitación se elimina en la próxima versión de Python 3.7, consulte issue #27213 y issue #12844; # 27213 reformuló la familia de códigos de operación CALL_FUNCTION*
para rendimiento y simplicidad (parte de 3.6), liberando el argumento de código de operación para codificar solo un recuento de un solo argumento, y # 12844 eliminó la verificación en tiempo de compilación que impidió que se compilara más código.
En 3.7, con el EXTENDED_ARG()
opcode, no hay ahora hay límite en absoluto de la cantidad de argumentos que puede pasar en el uso de argumentos explícitos, guardar el número puede ser instalado en la pila (tan ligada ahora por la memoria):
>>> 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)))))
hacer la nota que las listas, tuplas y diccionarios se limitan a sys.maxsize
elementos, por lo que si la función llamada utiliza *args
y/o **kwargs
de captura-todos los parámetros a continuación, los son limitadas.
Para la sintaxis de llamada *args
y **kwargs
(argumentos de expansión) no hay límites que no sean los mismos límites de tamaño sys.maxint
en los tipos estándar de Python.
Parece que el límite está en el lado de la llamada. Pruebe exec 'f (' + ','. Join (str (i) for i in range (5000)) + ')' – Brian
"WFM"? ¿WTF? .... –
@Stefan: * Works For Me * –