Bien sûr qu'il y en a, ça ne peut pas être illimité*. La phrase clé de la documentation qui, selon moi, doit être soulignée est la suivante :
[...] La fonction lit ensuite une ligne de l'entrée, le convertit en une chaîne de caractères (sans le saut de ligne de fin) [...]
(c'est moi qui souligne)
Puisqu'il convertit l'entrée que vous fournissez en une Python str
l'objet se traduit essentiellement par : "Sa taille a doit être inférieure ou égale à la plus grande chaîne que Python peut créer".
La raison pour laquelle aucune taille explicite n'est donnée est probablement parce qu'il s'agit d'un détail d'implémentation. Imposer une taille maximale à toutes les autres implémentations de Python n'aurait pas beaucoup de sens.
*En CPython, au moins, la taille maximale d'une chaîne de caractères est limitée par la taille de sa chaîne de caractères. indice est autorisé à être (voir PEP 353 ). C'est-à-dire la taille du chiffre entre parenthèses. []
est autorisé à être lorsque vous essayez de l'indexer :
>>> s = ''
>>> s[2 ** 63]
IndexErrorTraceback (most recent call last)
<ipython-input-10-75e9ac36da20> in <module>()
----> 1 s[2 ** 63]
IndexError: cannot fit 'int' into an index-sized integer
(essayez le précédent avec <code>2 63 - 1</code> c'est la limite positive acceptable, <code>-2 63</code> est la limite négative).
Pour les indices, ce ne sont pas les nombres Python qui sont utilisés en interne, mais plutôt un Py_ssize_t
qui est un int signé 32/64 bits sur des machines 32/64 bits respectivement. C'est donc la limite maximale, à ce qu'il semble.
(comme l'indique le message d'erreur, int et entier de taille intex sont deux choses différentes)
Il semble aussi que input()
contrôles explicites si l'entrée fournie est plus grande que PY_SSIZE_T_MAX
(la taille maximale de Py_ssize_t
) avant de procéder à la conversion :
if (len > PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_OverflowError,
"input: input too long");
result = NULL;
}
Ensuite, il convertit l'entrée en un langage Python str
con PyUnicode_Decode
.
Pour mettre cela en perspective, si un livre moyen est 500.000
et les estimation pour le nombre total de livres est d'environ 130 millions, vous pourriez théoriquement input
autour :
>>> ((2 ** 63) - 1) // 500000 * 130000000
141898
fois ces caractères ; cela vous prendrait probablement un certain temps, cependant :-) (et vous seriez d'abord limité par la mémoire disponible !)