Примером именно того, что вы хотите, является sqlalchemy s cextensions , которые существуют специально для той же цели - более быстрой реализации Си Чтобы увидеть, как SA реализовал это, вам нужно взглянуть на 2 файла:
1) setup.py . Как видно из выписки ниже, они обрабатывают дела с setuptools
и distutils
:
try:
from setuptools import setup, Extension, Feature
except ImportError:
from distutils.core import setup, Extension
Feature = None
Позже происходит проверка if Feature:
, и расширение настраивается правильно для каждого случая с использованием переменной extra
, которая позже добавляется к функции setup()
.
2) base.py : посмотрите, как определяется BaseRowProxy
:
try:
from sqlalchemy.cresultproxy import BaseRowProxy
except ImportError:
class BaseRowProxy(object):
#....
Таким образом, как правило, после установки расширений C (с использованием флага --with-cextensions
во время установки) будет использоваться реализация C. В противном случае используется чистая Python-реализация класса / функции.