Objetos no incluye métodos en la lista de comprensión
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:
- llamar al subarchivo,
- crear una lista de nombres de datos
- recorrer la lista para crear una instancia de los objetos; y
- 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
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.