resueltos - extraño comportamiento de Python con la mezcla de parámetros/parámetros y una función llamada ''top''
lista de funciones de python (1)
Parece que es un error en el manejo de la tabla de símbolos. Python / symtable.c tiene algún código que (aunque algo confuso) de hecho trata al ''top'' como un identificador especial:
if (!GET_IDENTIFIER(top) ||
!symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
PySymtable_Free(st);
return NULL;
}
seguido un poco más tarde por:
if (name == GET_IDENTIFIER(top))
st->st_global = st->st_cur->ste_symbols;
Más arriba en el archivo hay una macro:
#define GET_IDENTIFIER(VAR) /
((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
que utiliza el preprocesador de C para inicializar la top
la variable a una cadena internada con el nombre de la variable.
Creo que la tabla de símbolos debe usar el nombre ''top'' para referirse al código de nivel superior, pero no tengo idea de por qué no usa algo que no pueda entrar en conflicto con una variable real.
Lo reportaría como un error si fuera usted.
El siguiente código (no directamente en un intérprete, pero se ejecuta como archivo)
def top(deck):
pass
def b():
global deck
produce el error
SyntaxError: name ''deck'' is local and global
en python2.6.4 y
SyntaxError: name ''deck'' is parameter and global
en python 3.1
python2.4 parece aceptar este código, al igual que el intérprete interactivo 2.6.4.
Esto ya es extraño; ¿Por qué ''deck'' entra en conflicto si es un método global en un método y un parámetro en el otro?
Pero se pone más raro. Renombra ''top'' a básicamente cualquier otra cosa, y el problema desaparece.
¿Alguien puede explicar este comportamiento? Siento que me estoy perdiendo algo muy obvio aquí. ¿El nombre ''top'' afecta de alguna manera a ciertos aspectos internos del alcance?
Actualizar
Esto de hecho parece ser un error en el núcleo de python. He presentado un informe de error .