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