Seite 1 von 1

TypeError: lines() takes 1 positional argument but 2 were given

Verfasst: Montag 30. Juli 2018, 06:45
von tzabbi
Moin Leute,

ich bin gerade dabei Python zu lernen.
Derzeit möchte ich die Objektorientierung verstehen und schreibe einfache Klassen.

Jetzt bin ich bei einem Fehler, den ich derzeit nicht alleine beheben kann. Vielleicht könnt Ihr mir helfen.

Ich habe folgenden Code:

Code: Alles auswählen

class FileReader():
        def __init__(self, dateipfad):
                self.file =  dateipfad
                self.lst = []

        def lines(self):
                with open(self.file) as datei:
                        for line in datei:
                                strng = line.strip()
                                self.lst.append(strng)

                        return self.lst

class CsvReader(FileReader):
        def __init__(self, dateipfad):
                super().__init__(dateipfad)
                self.oberliste = []

        def lines(self):
                super().lines(self)
                for entry in self.lst:
                        print(entry)


f = CsvReader("datei.csv")
print(f.lines())


Daraufhin erscheint folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "08AufgabeVererbung.py", line 27, in <module>
    print(f.lines())
  File "08AufgabeVererbung.py", line 20, in lines
    super().lines(self)
TypeError: lines() takes 1 positional argument but 2 were given

Könnt Ihr mir da helfen?

Ich möchte im Grunde nichts anderes machen, als eine csv-Datei auslesen und diese in einer Liste ausgeben. Es steht in der Datei 3 Werte pro Zeile, die durch ein Komma getrennt sind.

Viele Grüße
tzabbi

Re: TypeError: lines() takes 1 positional argument but 2 were given

Verfasst: Montag 30. Juli 2018, 07:16
von kbr
Das 'self' beim Aufruf von 'super().lines()' ist als Parameter nicht erforderlich. (Es gibt auch schon einen fertigen CSVReader in der Standard Library.)

Re: TypeError: lines() takes 1 positional argument but 2 were given

Verfasst: Montag 30. Juli 2018, 08:38
von Sirius3
@tzabby: Vererbung wird in Python recht selten gebraucht, und man schreibt auch nicht für alles Klassen. Deine Klassen sind z.B. im jetzigen Zustand unnötig. Die Klasse FileReader hat als (fast) einzigen Zustand eine Liste und als einzige Methode `lines` eine Funktion, die diese Liste füllt. Damit kann man das einfach als Funktion schreiben:

Code: Alles auswählen

def read_lines(dateipfad):
    with open(dateipfad) as datei:
        return [line.strip() for line in datei]
Für CSVReader gilt eigentlich das selbe, nur eine Funktion, die etwas ausgibt:

Code: Alles auswählen

def print_lines(dateipfad):
    lines = read_lines(dateipfad)
    for entry in lines:
        print(entry)
Weiter gilt das, was kbr schon geschrieben hat: wenn Du einen CSV-Reader willst, nimm csv.reader aus der Standardbibliothek.