1
votes

Déclarez une liste de classe personnalisée comme argument de fonction dans Python 3.6

Je veux taper les entrées d'une méthode de classe en Python 3. Je veux que l'argument soit une list d'une classe personnalisée que j'ai créée. La définition de la méthode est la suivante:

    def add_report_data(self, report_data: list[ReportData]):
TypeError: 'type' object is not subscriptable

ReportData est une classe régulière définie comme suit:

class ReportData:
    def __init__(self, system: str, value: int):
        self.__system = system
        self.__value = value

Lors de l'exécution de mon code, je reçois l'erreur suivante:

def add_report_data(self, report_data: list[ReportData]):
    pass

Cependant, changer le type de report_data en simplement list est capable de s'exécuter, mais ce n'est pas exactement ce que je veux faire. Une idée de ce qui se passe? Merci.


2 commentaires

add_report_data fait partie de la classe ReportData ?


Comme le premier commentaire l'indique, votre question n'est pas claire car vous n'affichez pas un seul extrait de code exécutable qui montre votre erreur. Veuillez lire et suivre Comment créer un exemple minimal, complet et vérifiable .


3 Réponses :


5
votes

Vous souhaitez importer la saisie.List and do List[ReportData]

List[ReportData] fait référence à la version générique de la list utilisée pour la saisie au lieu de list[ReportData] , qui fait référence à la liste des types de données

#Importing List from typing
from typing import List

class ReportData:
    def __init__(self, system: str, value: int):
        self.__system = system
        self.__value = value

class A:
    #Using List[ReportData]
    def add_report_data(self, report_data: List[ReportData]):
        pass


0 commentaires

0
votes

Comme Devesh l'a répondu, votre problème est qu'en fait, vous ne tapez pas le paramètre report_data avec une list de type ReportData plutôt que vous essayez d'obtenir l'élément de la list à l'index ReportData , et cela vous donne l'erreur car ReportData n'est pas un index valide.

Lorsque vous essayez de taper comme une list de type MyClass vous devez utiliser la typing.List et transmettre que l'élément types.


0 commentaires

0
votes

Sur Python 3.9+ et Python 3.7+ si vous faites cela

from __future__ import annotations

vous pouvez utiliser list comme annotation de type. Votre code doit fonctionner tel que vous l'avez écrit.


0 commentaires