Внутренняя ошибка - это явно ошибка в самом Python, и если вы заинтересованы в дальнейшем изучении этого вопроса и предложении исправления для ядра Python, то упрощение кода до места, где он по-прежнему вызывает ошибку, будет правильной стратегией. .
Если вы больше заинтересованы в том, чтобы ваш код работал, а не исправлял ядро Python, тогда я предлагаю вам избежать некоторых из нескольких аномалий в вашем коде, которые могут привести к путанице в Python. Например, я не знаю, чтобы кто-либо когда-либо думал проверять свойство для вложенной функции с именем f
, содержащей еще одну вложенную функцию также с именем f
- это ДОЛЖНО работать, но это точно такого рода вещи, которые, возможно, не были хорошо проверены только потому, что никто еще не думал об этом, и хотя намеренное провоцирование таких аномалий является очень хорошей стратегией для усиления набора тестов, лучше всего этого избежать, если вы намеренно не ошибки в внутренностях Python.
Итак, во-первых, я бы убедился, что вокруг нет омонимии. Если это по-прежнему оставляет ошибку, я бы затем удалил использование объектов ячеек, превратив то, что в настоящее время является доступом к нелокальным переменным, в «предварительные аргументы», например, ваш «полу-внешний» f
может быть изменен для начала: 1010 *
def f(self=self):
и ваш «полностью внутренний» может стать:
def g(req, self=self):
Это сделает доступ к self
в любой из этих функций (в настоящее время доступ к нелокальной переменной) в доступ к локальной переменной. Да, вам не нужно этого делать (в любом программном обеспечении не должно быть ошибок, требующих обхода), но, увы, совершенство не характерно для этого подлунного мира, так что изучение стратегий обхода ошибок неизбежно часть жизни; -).