Проблемы с использованием кода C в Python | Комплект 1

Опубликовано: 12 Апреля, 2022

Предпосылка: Использование кодов C в Python | Набор 1, Набор 2

Проблема №1: при использовании ctypes возникает проблема, заключающаяся в том, что исходный код C может использовать язык, который не соответствует точному отображению на Python.

Let’s take the example of divide() function as it returns a value through one of its arguments. It is a common C technique but it is often not clear how it is supposed to work in Python.

divide = _mod.divide
divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
x = 0
divide(10, 3, x)

Выход :

Отслеживание (последний вызов последний):
  Файл "", строка 1, в 
ctypes.ArgumentError: аргумент 3:: ожидается LP_c_int
экземпляр вместо int


Проблема №2:
Даже если это работает, то есть нарушение неизменности целых чисел Python. Для аргументов, включающих указатели, должен быть создан совместимый объект ctypes, который передается, как в приведенном ниже коде.

x = ctypes.c_int()
print ("divide(10, 3, x) : ", divide(10, 3, x))
  
print ("x.value : ", x.value)

Выход :

разделить (10, 3, x): 3

x.value: 1

Проблема №3:

In the code below, an instance of a ctypes.c_int is created and is passed in as the pointer object .c_int object can be mutated unlike a normal Python integer. To either retrieve or change the value, .value attribute can be used.

# int divide(int, int, int *)
_divide = _mod.divide
  
_divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
_divide.restype = ctypes.c_int
  
def divide(x, y):
    rem = ctypes.c_int()
    quot = _divide(x, y, rem)
    return quot, rem.value

 
Issue #4 : The avg() function is a challenge.

Базовый код C ожидает длину, представляющую массив, и получает указатель. Однако со стороны Python на практике «массив» Python может принимать множество различных форм, он может быть массивом, списком, кортежем или массивом numpy, и, возможно, вы захотите поддержать несколько возможностей.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.