Comprensión de lista sobre un objeto mapa que accede a una propiedad
Tengo la siguiente comprensión de lista:
preprocesador_video = preprocess(video)
timestamps = [frame.timestamp for frame in preprocessed_video]
La colección siempre está vacía, aunque haya marcos con su valor de marca de tiempo correspondiente inicializado. El video es un objeto de mapa, que consiste en una colección de marcos, proveniente de otra función de preprocesamiento, y un marco es una clase con una propiedad de marca de tiempo:
def preprocess(video):
return map(fun, video) # fun devuelve un Frame
clase Frame ():
def init (… timestamp):
self.timestamp = marca de tiempo
…
@property
def timestamp():
return self.timestamp
Si en preprocess(video) devuelvo una lista como list(map(fun, video)), la comprensión de lista timestamp tiene valores. Sin embargo, si solo devuelvo un mapa, obtengo una lista vacía. ¿Por qué está sucediendo esto?
davy.ai
El problema es causado por retornar un objeto
map
en lugar de una lista después de preprocesar el video.map
es un iterador de carga perezosa, lo que significa que actúa como un generador que solo genera los valores según sea necesario, y puede comportarse de manera diferente a una lista en ciertas situaciones.En el código dado, cuando la comprensión intenta extraer la propiedad
timestamp
de cadaframe
, no está generando los valores del objetomap
. Cuando se convierte el valor devuelto depreprocess(video)
a una lista usando la funciónlist()
, el objetomap
genera los valores y, por lo tanto, la comprensión tiene valores paratimestamps
.Para solucionar este problema, podemos modificar la función
preprocess
para que devuelva una lista en lugar de un objetomap
o convertir el objetomap
a una lista antes de usar la comprensión. Una posible modificación a la funciónpreprocess
podría ser:Esto asegurará que la función devuelva una lista que se utilizará para inicializar la variable
preprocessed_video
, y la comprensión posterior generará la lista detimestamps
deseada.