LINUX.ORG.RU

Разбиение на пакеты/фичи в Питоне

 , , условная компиляция


0

3

Всем привет!

Возник тут у меня такой базовый вопрос о разработке на Питоне, а вернее о разработке проектов посложнее простых скриптов, таких, в которых могут быть фичи, не доступные на таргет системе, и которые в таком случае необходимо отключать, не затрагивая работоспособность остальных фич (независимых от тех, которые отключаются).

Вот, например, есть у меня разные модули системы на Питоне, которые по сути обертки над сишными библиотеками, но которые (и обертки, и библиотеки) скорее всего установлены в типичном дистре Линукс для широкого круга пользователей. В этом случае может быть достаточно в требованиях по зависимостям доставить нужные пакеты.

Но что, если таких пакетов в дистре нет, и некоторые фичи из-за этого оказываются нерабочими?

В компилируемых языках можно на этапе конфигурирования сборки определить/задать нужный набор фич, и потом прокинуть их в препроцессор.

А как это обычно делается на Питоне? Специальный класс/модуль, который все модули с фичами импортирует с try/except на каждый импорт (который может зафейлиться) и который потом выдает конфиг доступных фич? Но это же какое-то УГ получается, нарушение принципа инкапсуляции модулей.

А как сделать это грамотно на Питоне?

★★★★★

Примерно так

def _determinePickleModule():
    """
    Determine which 'pickle' API module to use.
    """
    try:
        import cPickle
        return cPickle
    except ImportError:
        import pickle
        return pickle

pickle = _determinePickleModule()

Yur4eg ★★
()
Ответ на: комментарий от Yur4eg

Так можно выбирать между альтернативами. Причем, с одинаковым API. А что если есть либо все, либо ничего? Без препроцессора не обойтись...

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

точно так же можно и отключать недоступные фичи. только в обработчике исключения ты не импортируешь другой модуль, а делаешь то что нужно, чтобы отключить эту фичу

eternal_sorrow ★★★★★
()

пакуешь все свое добро в докир контейнер и забываешь этот пердолинг как страшный сон

anonymous
()

Есть вот такой костыль - https://www.python.org/dev/peps/pep-0508/#extras, но он немного не про то.

Есть возможность в python setup.py build передавать флаги, и в зависимости от них собирать/не собирать какие-то модули.

Ну и есть вариант, который предложил анонимус комментом выше.

ei-grad ★★★★★
()
Последнее исправление: ei-grad (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.