Ответ 1
Похоже, что это ошибка в обработке таблиц символов. Python/symtable.c имеет некоторый код, который (хотя и несколько запутанный) действительно рассматривает "верхний" как специальный идентификатор:
if (!GET_IDENTIFIER(top) ||
!symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
PySymtable_Free(st);
return NULL;
}
несколько позже:
if (name == GET_IDENTIFIER(top))
st->st_global = st->st_cur->ste_symbols;
Далее в файле есть макрос:
#define GET_IDENTIFIER(VAR) \
((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
который использует препроцессор C для инициализации переменной top
для интернированной строки с именем переменной.
Я думаю, что в таблице символов должно использоваться имя "верх", чтобы ссылаться на код верхнего уровня, но почему он не использует то, что не может конфликтовать с реальной переменной, о которой я понятия не имею.
Я бы назвал это ошибкой, если бы я был вами.