«Мое приложение должно иметь возможность вызывать внешние функции Python (написанные пользователем) как обратные вызовы».
Есть альтернатива, которая часто проще.
Определите классы, которые вызывают функции метода в определенных точках. Вы предоставляете реализацию по умолчанию.
Ваш пользователь может затем расширять классы и предоставлять соответствующие функции метода вместо обратных вызовов.
Это редко требует глобальных переменных. Это также проще реализовать, потому что ваш пользователь делает что-то вроде следующего
import core_classes
class MyExtension( core_classes.SomeClass ):
def event_1( self, args ):
# override the default behavior for event_1.
core_classes.main( MyExtension )
Это работает очень плавно и обеспечивает максимальную гибкость. Ошибки всегда будут в их коде, поскольку их код является «основным» модулем.