• Как написать консольную программу?

    @brake
    Если задача на каждый параметр вызывать функцию (чтобы не плодить if/else), то можно задействовать сабпарсеры
    subp = aparser.add_subparsers()
    subparser1 = subp.add_parser('g', help='Generation mode')
    subparser1.set_defaults(func=generate)

    в последнем вызове set_defaults(func=xxx) как раз задается функция для параметра.
    Потом эта функция может быть вызвана так:

    args = aparser.parse_args()
    args.func()
  • Как реализовать plugin-ы/расшерения?

    @brake
    Ну, во первых, мне не кажется, что передавать необходимый объект параметром некрасиво (а для чего тогда параметры вообще?).
    Если это, по какой-то причине, нежелательно, то можно воспользоваться тем, что все плагины "живут" в одном модуле, у которого есть __init__.py:

    #__init__.py
    app = None

    #plugin_loader.py
    import plugin
    plugin.app = falcon.API()

    #some_plugin.py
    from plugin import app
    things = ThingsResource()
    app.add_route('/things', things)

    На мой вкус это не красивее параметра, передаваемого в плагин (и кода больше и логика запутаннее, а если у app появятся "братики и сестренки" то это быстро станет адом, __init__.py больше подходит для хранения общих для всех плагинов настроечных констант.

    PS: чтобы работал импорт в some_plugin.py, возможно, придется поиграться с sys.path.