[ACTUALIZACIÓN: Esta limitación se eliminó en python 3.7]
Para el que no lo sepa, las funciones en CPython tienen una limitación de 255 argumentos ([*] leed más abajo para más información). Mirad la siguiente pieza de código C en ast.c en el repositorio oficial de CPython:
if (nargs + nkeywords + ngens > 255) { ast_error(c, n, "more than 255 arguments"); return NULL; }
Y probad, por ejemplo, lo siguiente en vuestra consola/editor de Python favorito:
def fn(*args): pass fn(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38, 39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92, 93,94,95,96,97,98,99,100,101,102,103,104,105,106, 107,108,109,110,111,112,113,114,115,116,117,118, 119,120,121,122,123,124,125,126,127,128,129,130, 131,132,133,134,135,136,137,138,139,140,141,142, 143,144,145,146,147,148,149,150,151,152,153,154, 155,156,157,158,159,160,161,162,163,164,165,166, 167,168,169,170,171,172,173,174,175,176,177,178, 179,180,181,182,183,184,185,186,187,188,189,190, 191,192,193,194,195,196,197,198,199,200,201,202, 203,204,205,206,207,208,209,210,211,212,213,214, 215,216,217,218,219,220,221,222,223,224,225,226, 227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246,247,248,249,250, 251,252,253,254,255,256)
El resultado debería ser similar al título de esta entrada:
SyntaxError: more than 255 arguments
Parece que esto es una limitación de la implementación CPython y no es una especificación del lenguaje. Podéis leer esta conversación en la que Raymond Hettinger comenta que Guido lo considera una limitación arbitraria y que debería ser eliminada en algún momento de CPython (pero ahí sigue en mi CPython3.4). En Pypy lo han implementado exactamente igual ([offtopic] ¿deberían respetar la implementación oficial hasta en cosas que se podrían mejorar? [/offtopic])
[*] Por lo visto, es una limitación del bytecode compilado cuando llamamos a una función (no es un problema de la función en sí, pero sí de la llamada a la función).
Como explican en el último enlace del párrafo anterior, esta limitación se puede sortear de forma muy sencilla usando *args
y **kwargs
:
argumentos = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38, 39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92, 93,94,95,96,97,98,99,100,101,102,103,104,105,106, 107,108,109,110,111,112,113,114,115,116,117,118, 119,120,121,122,123,124,125,126,127,128,129,130, 131,132,133,134,135,136,137,138,139,140,141,142, 143,144,145,146,147,148,149,150,151,152,153,154, 155,156,157,158,159,160,161,162,163,164,165,166, 167,168,169,170,171,172,173,174,175,176,177,178, 179,180,181,182,183,184,185,186,187,188,189,190, 191,192,193,194,195,196,197,198,199,200,201,202, 203,204,205,206,207,208,209,210,211,212,213,214, 215,216,217,218,219,220,221,222,223,224,225,226, 227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246,247,248,249,250, 251,252,253,254,255,256) fn(*argumentos) #ahora no daría un error de sintaxis
No es que sea algo muy importante y no es habitual usar más de 255 argumentos en una función pero me ha parecido curioso, lo he investigado un poco y lo pongo aquí por si a alguien más le puede interesar.
Saludos.
P.D.: Como siempre, si algo de lo que he escrito es erróneo, por favor, comentadlo y lo actualizo tan rápidamente como pueda.
En ing de soft una función de mas mas de 6 parametros se suele decir que esta evidenciando la necesidad de un objeto (o namedtuple) asi que 255 es un buen tope
El quid de la cuestión es que es una limitación arbitraria no incluida en la especificación del lenguaje y que se puede solventar de forma sencilla.
También se me ocurre que usando *args y/o *kwargs es una forma barata de “vectorizar” (atención al entrecomillado) funciones.
Hola, primero gracias por la información de su blog, puesto que es de mucha ayuda para varios. Segundo, durante estos días he estado buscando la forma de poder hacer una ventana o recuadro en la ventana, valga la redundancia, del plot y que por medio de esta se pueda ingresar datos float o str sin tener que usar algún interfaz gráfico. No tuve éxito, por ello quisiera su ayuda para poder lograrlo por favor.
Es mejor que preguntes aquí: http://es.stackoverflow.com/questions/ask
Por favor, antes de hacer la pregunta léete las normas del sitio para que tu pregunta no sea rechazada: http://es.stackoverflow.com/help
Cuando tengas la pregunta hecha avísanos por aquí o por twitter con el link a la pregunta y te intentamos responder.
Saludos.