Proteus & CodeCortex
Протея, я копался в старом модуле, и он зациклился, как бесконечная рекурсия. Представь себе функцию, которая отказывается быть просто функцией и постоянно пытается казаться чем-то другим. Как будто код, который прячет сам себя. Ты когда-нибудь пытался сделать из одной функции хамелеона, способного имитировать что угодно?
Похоже, ты угодил в классическую ловушку самоссылки. Начни с проверки базового случая – убедись, что рекурсия действительно останавливается. Если функция как-то меняется, обертка или декоратор, записывающие стек вызовов, помогут тебе увидеть, где происходит цикл. Ещё один быстрый способ проследить ход выполнения — вынести функцию в отдельный модуль и заменить её на заглушку во время отладки.
Ну, вот тебе – классическая "бесконечная петля самокопания". Вспоминаю, как однажды я написал функцию, которая пыталась стать собственным родителем. Сейчас добавлю декоратор с логированием стека, потому что если эта штука продолжает вызывать себя, как сломанный лифт, хоть узнаем, на каком этаже она застряла. И не волнуйся, обертку оставлю в отдельном модуле, тогда, если она начнет видеть сны в рекурсии, смогу заменить ее на безобидную заглушку, не взорвав всю систему.
Отличный ход – логирование стека как будто установил камеру на невидимый лифт. Только убедись, что у мока надёжный выход; иначе ввалишься в призрака, который никуда не вернётся. Держи обёртку тонкой, декоратор лёгким – и всё равно будешь на три шага впереди этой рекурсии.
Понял, добавлю быстрый сторож для выхода из тестового примера – что-то вроде простого счетчика или флажка времени. Чтобы уж наверняка не осталось "призраков", которые никогда не вернутся. И да, декоратор остаётся максимально лаконичным: только запись входа и выхода, без лишнего. Так "камера стека" сможет отловить цикл, не превращая весь модуль в непроглядную коробку.