Я, конечно, может чего-то не понимаю. Наверное, вопроса.
Но для чего объявление функций делать после их вызова? Как компилятор, при вызове a(), обратившись к ее объявлению "def a()...", перейдет во внутрь функции, попробует вызвать функции b() и d(), о которых он еще ничего не знает, ведь они описаны далее. Как возможна корректная работа подобного алгоритма? Объявление (а иногда еще и реализация) функций делается строго до их вызова. Не зря они всегда в начале. Вместе с переменными и прочим. Есть определенные правила. Писать код как вздумается - не пройдет. Будет получена ошибка компилятора навроде: "функция b() не найдена".
Также не совсем понятна фраза: "методы в функции". Словом def здесь что обозначено: метод или функция? Просто не знаком с этим ЯП. Быть может, здесь такие приколы вполне возможны? А кто-то просто не в теме?
Компьютер - в целом и компилятор - в частности - не телепат. Он должен знать с чем и как работать. Если доступно и правильно объяснить, то он не станет материться. :)