API Python/C имеет ряд связанных функций, которые выполняют аналогичные операции, где обычно используется для общего использования, а другое - как-то более эффективно или удобно для конкретной ситуации.Разница между PyInt_FromLong и Py_BuildValue
Например, PyDict_SetItem
и PyDict_SetItemString
те же, но последний специализирован для строки C в качестве ключа. Для PyList_SetItem
и PyList_SET_ITEM
второй не имеет проверки ошибок и не уменьшает существующий элемент (explained here).
Но в чем причина наличия специальных конверсий, таких как PyInt_FromLong
, когда всегда есть Py_BuildValue
? Оба возвращают новую ссылку на объект Python и, похоже, делают то же самое. Этот же вопрос относится к таким функциям, как PyInt_FromSsize_t
, PyTuple_Pack
и т. Д. (Все по сравнению с Py_BuildValue
с соответствующей строкой формата).
Когда вы должны использовать один над другим?
Вы можете увидеть 'Py_BuildValue' в результате [фасадного рисунка] (http://en.wikipedia.org/wiki/Facade_pattern). Это вызов высокого уровня, который объединяет множество вызовов низкого уровня. Это не требуется, но полезно. Очевидно, что с одной функцией «Py_BuildValue» без низкоуровневого API вы получите монстра сотен или более строк кода для поддержки, поэтому вы должны * делать все наоборот: иметь API-интерфейсы низкого уровня и фасадную функцию для доступа на высоком уровне, которая намного короче и удобна в обслуживании. – Bakuriu