Objetos no incluye métodos en la lista de comprensión

Nov 27 2020

Esta pregunta está relacionada con mi pregunta anterior y la respuesta de Bill allí.

Tengo una clase llamada StrucData en subfile.py

class StrucData:  
    def __init__(self, name):
        self.name=name
    
    def loadData(self, size=1, cost=1):
        self.size=size  
        self.cost=cost
        return self

En el archivo principal yo:

  1. llamar al subarchivo,
  2. crear una lista de nombres de datos
  3. recorrer la lista para crear una instancia de los objetos; y
  4. cargar datos usando el método 'loadData' para cada objeto (estoy usando el mismo 'tamaño' y 'costo' para facilitar este ejemplo).

de una vez usando una lista de comprensión:

# in the main file

from subfile import StrucData 

listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

La salida es

listObjects=[object1, object2, object3]

en el que cada objeto contiene sus atributos definidos en el subfile.py (nombre, tamaño, costo).

Lo que me pregunto es cuando defino un objeto usando el mismo código que

x=StrucData(listIndex[0]).loadData(size=3, cost=4) 

también contiene el método 'loadData'.

¿Alguien podría explicarme por qué sucede?

Yo uso la distribución anaconda3 de Spyder, la información de la versión es

Respuestas

2 PatrickArtner Nov 27 2020 at 12:23

El inspector utilizado al depurar su aplicación dentro de Spyder trata los objetos dentro de las listas de manera diferente a los objetos singulares del mismo tipo. Simplemente muestra cosas diferentes y, si está en una lista, omite la función.

Puede comprobar fácilmente si ambos objetos tienen este método imprimiéndolo:

listIndex = ['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

other = StrucData("other").loadData(size=3, cost=4) 

print(listObjects[0].loadData)
print(other.loadData)

Puede asignar uno de los elementos de la lista a una variable normal y verificar su salida del inspector para verificar:

lO = listObjects[1]

Establezca un punto de interrupción e inspecciónelo; ahora aparece el método.

En cuanto al por qué: pregunte a los codificadores responsables del código del inspector de depuración de Spyder. Como conjetura arriesgada: para ahorrar espacio en la pantalla cuando se muestran objetos que están agrupados dentro de una lista.