Problemas con el uso de código C en Python | Serie 1

Requisito previo: uso de códigos C en Python | Juego 1 , Juego 2

Problema n.º 1: si usa ctypes , existe el problema de que el código C original puede usar un lenguaje que no se asigna claramente a Python.

Tomemos el ejemplo de la divide()función, ya que devuelve un valor a través de uno de sus argumentos. Es una técnica común de C, pero a menudo no está claro cómo se supone que funciona en Python.

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

Producción :

Traceback (most recent call last):
  File "", line 1, in 
ctypes.ArgumentError: argument 3: : expected LP_c_int
instance instead of int

 
Problema n. ° 2:
incluso si funciona, existe una violación de la inmutabilidad de los números enteros de Python. Para los argumentos que involucran punteros, se debe construir un objeto ctypes compatible y se pasa como en el código dado a continuación.

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

Producción :

divide(10, 3, x) : 3

x.value : 1

Número 3:

En el siguiente código, se crea una instancia de ctypes.c_int y se pasa como el objeto de puntero. El objeto c_int se puede mutar a diferencia de un entero normal de Python. Para recuperar o cambiar el valor, se puede usar el atributo .value .

# 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

 
Problema #4: La avg()función es un desafío.

El código C subyacente espera una longitud que represente una array y reciba un puntero. Sin embargo, desde el lado de Python en la práctica, una «array» de Python puede tomar muchas formas diferentes, puede ser una array, una lista, una tupla o una array numérica y tal vez le gustaría admitir múltiples posibilidades.

Publicación traducida automáticamente

Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *