Requisito previo: problemas con el uso de código C en Python | Serie 1
La clase DoubleArrayType puede manejar la situación de Python que tiene diferentes formas como array, array numpy, lista, tupla. from_param()
En esta clase, se define un único método . Este método toma un solo parámetro y lo reduce a un objeto ctypes compatible (un puntero a ctypes.c_double
, en el ejemplo).
En el siguiente código, el nombre de tipo del parámetro se extrae y se usa para enviar a un método más especializado. Por ejemplo, si se pasa una lista, el nombre de tipo es lista y from_list()
se invoca un método. Para listas y tuplas, el from_list()
método realiza una conversión a un objeto de array ctypes.
Código #1:
nums = [1, 2, 3] a = (ctypes.c_double * len(nums))(*nums) print ("a : ", a) print ("\na[0] : ", a[0]) print ("\na[1] : ", a[1]) print ("\na[2] : ", a[2])
Producción :
a : <__main__.c_double_Array_3 object at 0x10069cd40> a[0] : 1.0 a[1] : 2.0 a[2] : 3.0
El método extrae el puntero de memoria subyacente y lo convierte en un objeto de puntero ctypes para objetos de array. from_array()
Código #2:
import array arr = array.array('d', [1, 2, 3]) print ("arr : ", arr) ptr_ = a.buffer_info() print ("\nptr :", ptr) print ("\n", ctypes.cast(ptr, ctypes.POINTER(ctypes.c_double)))
Producción :
arr : array('d', [1.0, 2.0, 3.0]) ptr : 4298687200 <__main__.LP_c_double object at 0x10069cd40>
El from_ndarray()
muestra un código de conversión comparable para arrays numpy. Al definir la clase DoubleArrayType y usarla en la firma de tipo de avg()
, la función puede aceptar una variedad de diferentes entradas similares a arrays.
Código #3:
# libraries import sample import array import numpy print("Average of list : ", sample.avg([1, 2, 3])) print("\nAverage of tuple : ", sample.avg((1, 2, 3))) print(\nAverage of array : ", sample.avg(array.array('d', [1, 2, 3]))) print(\nAverage of numpy array : ", sample.avg(numpy.array([1.0, 2.0, 3.0])))
Producción :
Average of list : 2.0 Average of tuple : 2.0 Average of array : 2.0 Average of numpy array : 2.0
Para trabajar con una estructura C simple, simplemente defina una clase que contenga los campos y tipos apropiados como se muestra en el código a continuación. Después de definir, se puede usar la clase en las firmas de tipos, así como en el código que necesita instanciar y trabajar con las estructuras.
Código #4:
class Point(ctypes.Structure): _fields_ = [('x', ctypes.c_double), ('y', ctypes.c_double)] point1 = sample.Point(1, 2) point2 = sample.Point(4, 5) print ("pt1 x : ", point1.x) print ("\npt1 y : ", point1.y) print ("\nDistance between pt1 and pt2 : ", sample.distance(point1, point2))
Producción :
pt1 x : 1.0 pt1 y : 2.0 Distance between pt1 and pt2 : 4.242640687119285
Publicación traducida automáticamente
Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA