una resueltos propias otra mclibre matematicas lista funciones funcion ejercicios ejemplos dentro definir crea como python python-3.x

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 .