Objetos não incluem métodos na compreensão da lista

Nov 27 2020

Esta pergunta está relacionada à minha pergunta anterior e à resposta de Bill lá.

Eu tenho uma classe chamada StrucData em 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

No arquivo principal I:

  1. chame o subarquivo,
  2. crie uma lista de nomes de dados
  3. percorrer a lista para instanciar os objetos; e
  4. carregar dados usando o método 'loadData' para cada objeto (estou usando o mesmo 'tamanho' e 'custo' para tornar este exemplo fácil.)

de uma vez usando uma compreensão de lista:

# in the main file

from subfile import StrucData 

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

A saída é

listObjects=[object1, object2, object3]

em que cada objeto contém seus atributos definidos no subfile.py (nome, tamanho, custo).

O que me pergunto é quando defino um objeto usando o mesmo código que

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

ele contém o método 'loadData' também.

Alguém poderia me explicar por que isso acontece?

Eu uso a distribuição anaconda3 do Spyder, a informação da versão é

Respostas

2 PatrickArtner Nov 27 2020 at 12:23

O inspetor usado ao depurar seu aplicativo dentro do Spyder trata os objetos dentro das listas de maneira diferente de objetos singulares do mesmo tipo. Ele simplesmente exibe coisas diferentes e - se estiver em uma lista - omite a função.

Você pode verificar facilmente se ambos os objetos têm este método imprimindo-o:

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)

Você pode atribuir um dos elementos da lista a uma variável normal e verificar a saída do inspetor para verificar:

lO = listObjects[1]

Defina um ponto de interrupção e inspecione-o - agora o método aparece.

Quanto ao porquê: pergunte aos programadores responsáveis ​​pelo código do inspetor de depuração do Spyder. Como uma suposição arriscada: para salvar o estado da tela ao exibir objetos que estão agrupados em uma lista.