Abbiamo un'applicazione C ++, con le interfacce C ++ che cambiano regolarmente durante lo sviluppo. Abbiamo anche una API C che è progettata per essere stabile nonostante tali cambiamenti; l'API C è strettamente focalizzata sulle operazioni che il codice del client potrebbe voler fare.
Ora vogliamo aggiungere un'API Python per facilitare ai client esterni (o al nostro team) la creazione di script per il controllo dell'applicazione. Data la volatilità del codice C ++ e la natura stabile di progettazione dell'API C, ha senso costruire l'API Python su quella C. So che il modo per farlo è fornire un modulo di estensione (implementato in C ++) che sarà utilizzabile in Python e avvolgere le funzioni API C.
Quello che sto considerando è se dovrei fare questo modulo di estensione l'API Python (e quindi renderlo Python come possibile), o se dovrei tenere questo un "dettaglio implementaion" di Python API e crea un modulo Python puro su di esso, che servirà come vera e propria API esterna. Il modulo di estensione sarebbe quindi un vero e proprio involucro attorno alle funzioni C, rassegnandosi ad essere un bel codice Python.
Vedo i seguenti pro e contro:
API Python è un'estensione C ++
Ciò sarebbe più efficiente in quanto vi sono meno livelli intermedi. Allo stesso tempo, richiede codice boilerplate per fornire un comportamento Python in C ++ e il codice è generalmente più difficile da scrivere e mantenere (conteggio dei riferimenti, tabelle dei puntatori, ecc.).
API Python è un modulo che include l'estensione C ++
Questo ci permette di scrivere il codice Pythonic in Python, che è più facile e meno soggetto a errori. Probabilmente porterà anche a un'API più ricca e completa, dato che l'aggiunta di funzionalità è più semplice e veloce in Python che in C ++. Come svantaggio, c'è sovraccarico di runtime e memoria del livello aggiuntivo, così come la necessità di mantenere due bit separati di codice per una cosa.
La mia domanda principale è: ci sono evidenti svantaggi o svantaggi di alcuni degli approcci che non sono riuscito a prendere in considerazione, specialmente quelli che rendono una scelta chiaramente superiore all'altra? Inoltre, esiste una "best practice" ampiamente accettata per questo tipo di cose? O una "lista di controllo" per aiutare a scegliere l'approccio corretto per una situazione particolare?