CPython a une limite de 255 arguments transmis explicitement dans un appel:
>>> 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
Cette limitation est en place parce que Python 3.5, la CALL_FUNCTION
opcode surchargée l'argument opcode pour coder à la fois la. nombre d'arguments de position et de mot-clé sur la pile, tous deux codés dans un seul octet.
Cette limitation est supprimée dans la prochaine version de Python 3.7, voir issue #27213 et issue #12844; # 27213 retravaillé la famille d'opcodes CALL_FUNCTION*
pour la performance et la simplicité (partie de 3.6), libérant l'argument opcode pour coder seulement un seul argument, et # 12844 enlevé la vérification à la compilation qui empêchait le code avec plus d'arguments d'être compilés.
En 3.7, avec le EXTENDED_ARG()
opcode, il est maintenant pas de limite du tout sur le nombre d'arguments, vous pouvez passer en utilisant des arguments explicites, enregistrez combien peuvent être montés sur la pile (donc lié maintenant par votre mémoire):
>>> 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)))))
Notez que la liste, tuples et les dictionnaires sont limités à sys.maxsize
éléments, donc si la fonction appelée utilise *args
et/ou **kwargs
rattrapages tous les paramètres puis ceux sont limitées.
Pour la syntaxe d'appel *args
et **kwargs
(arguments d'expansion) il n'y a pas de limites autres que les mêmes limites de taille sys.maxint
sur les types standard Python.
Il semble que la limite soit du côté appelant. Essayez exec 'f (' + ','. Join (str (i) pour i dans la plage (5000)) + ')' – Brian
"WFM"? WTF? .... –
@Stefan: * Fonctionne pour moi * –