Ограничить таблицу символов?

Я искал некоторые угловые случаи для загрузки файлов python (2.7 на osx) в качестве файлов конфигурации. Я хотел посмотреть, что такое поведение, если я циклически запускал execfile. Я ожидал ошибку из памяти или большую замену, но я был довольно удивлен, когда получил другой результат.

Я настраиваю тестовый сценарий следующим образом:

'd' скрипт python с:

#!/usr/bin/python x = 0 execfile("d1") 

'd1' скрипт python с:

 #!/usr/bin/python x += 1 print "x = %d" % x execfile("d2") 

'd2' скрипт python с:

 #!/usr/bin/python x += 1 print "x = %d" % x execfile("d1") 

Результат:

 $ ./d x = 1 x = 2 x = 3 ... removed for brevity ... x = 997 x = 998 x = 999 Traceback (most recent call last): File "./d", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") ... removed for brevity ... File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") KeyError: 'unknown symbol table entry' , $ ./d x = 1 x = 2 x = 3 ... removed for brevity ... x = 997 x = 998 x = 999 Traceback (most recent call last): File "./d", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") ... removed for brevity ... File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") KeyError: 'unknown symbol table entry' , $ ./d x = 1 x = 2 x = 3 ... removed for brevity ... x = 997 x = 998 x = 999 Traceback (most recent call last): File "./d", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") ... removed for brevity ... File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") KeyError: 'unknown symbol table entry' , $ ./d x = 1 x = 2 x = 3 ... removed for brevity ... x = 997 x = 998 x = 999 Traceback (most recent call last): File "./d", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") ... removed for brevity ... File "d1", line 5, in <module> execfile("d2") File "d2", line 5, in <module> execfile("d1") File "d1", line 5, in <module> execfile("d2") KeyError: 'unknown symbol table entry' 

Мне было просто любопытно, был ли кто-то, кто мог бы объяснить, что здесь происходит? Почему он останавливается после выполнения execfile ~ 1000 раз?

One Solution collect form web for “Ограничить таблицу символов?”

Из исходного кода Python Objects/dictobject.c :

 / * Обратите внимание, что по историческим причинам PyDict_GetItem () подавляет все ошибки
  *, который может произойти (изначально dicts поддерживает только строковые ключи и исключения
  * не были возможны).  Итак, хотя первоначальное намерение заключалось в том, что возврат NULL
  * означает, что ключа нет, на самом деле это может означать это или что ошибка
  * (подавлено) при вычислении хэша ключа или что некоторая ошибка
  * (подавлено) произошло при сравнении ключей во внутреннем зонде dict
  * последовательность.  Отвратительным примером последнего является сравнение Python-кода
  * функция попадает в ошибку глубины стека, что может привести к возврату NULL
  * даже если ключ присутствует.
  * /

Таким образом, PyDict_GetItem() не всегда корректно сообщает об ошибках. Интересно … поэтому в следующем коде в Python/symtable.c ,

 v = PyDict_GetItem(st->st_blocks, k); if (v) { assert(PySTEntry_Check(v)); Py_INCREF(v); } else { PyErr_SetString(PyExc_KeyError, "unknown symbol table entry"); } 

Любая ошибка, возникающая при поиске символа (в том числе ошибок вне памяти), превращается в KeyError . Вероятно, это ошибка.

  • Рекомендации: как вы указываете требуемые зависимости в файле setup.py?
  • Как найти путь к указанному файлу?
  • Как ввести целочисленный кортеж от пользователя?
  • Python - Почему cmp () полезен?
  • Удалить символ при определенном индексе - python
  • Добавить в существующее поле массива elasticsearch, используя python
  • Инициализация переменных объекта - подход Java, подход Python?
  • Я пытаюсь импортировать модули автоматически и выполнять main () в Python
  • Python - лучший язык программирования в мире.