Seite 1 von 1

type Befehl funktioniert bei Strings nicht

Verfasst: Sonntag 7. Februar 2021, 19:02
von stii
Hey alle miteinander,
Ich möchte gerne mit dem Programmieren von Python anfangen und deswegen habe ich mir das Buch "Python 3 Programmieren für Einsteiger" von Michael Bonacina gekauft.
In dem Buch gibt es nach jedem Kapitel Aufgaben, um das gelernte zu wiederholen. Jetzt habe ich eine Aufgabe bei der bei mir ein Fehler auftaucht und ich etwas nicht verstehe, obwohl ich es genauso wie in der Lösung angegeben ausprobiert habe. Der Code ist:

inhalt = eval(input("GEBEN SIE ETWAS EIN: "))
print ("Datentyp: ", type (inhalt))
input()

An sich funktioniert das Programm auch, wenn ich aber eine Zeichenkette eingebe, zum Beispiel "Hallo", dann schließt sich das cmd-Fenster einfach, alle anderen Datentypen hingegen funktionieren. Meine zweite Frage wäre dann, was macht eval genau? Ich habe gelesen dass es ein Sicherheitsrisiko darstellt, zwar nicht wenn man das Programm nur Privat nutzt, trotzdem würde ich das gerne weglassen. Wie kann ich das machen? Oder ist es ohne eval nicht möglich bzw sehr kompliziert zu machen?
Wie gesagt, ich bin ein kompletter Anfänger, deswegen entschuldigt die vielleicht unnötige Frage, ich möchte aber Python verstehen. Könnt ihr mir helfen?
Vielen lieben Dank schonmal,

Gruss :D

Re: type Befehl funktioniert bei Strings nicht

Verfasst: Sonntag 7. Februar 2021, 20:01
von narpfel
Moin,

führe das Programm mal in einer Konsole aus und nicht durch Doppelklick. Dann kann sich das Fenster nicht bei einer Exception von alleine schließen und du kannst den Fehler sehen.

Warum `eval` problematisch ist, siehst du gerade. Und wenn das Buch das wirklich so empfiehlt, solltest du dir ein anderes Buch suchen, weil das einfach nur eine schlechte Idee ist, das so zu machen.

Warum `eval` ein Sicherheitsrisiko ist, siehst du, wenn du zum Beispiel `[0] * 10**100` eingibst. Oder `__import__("shutil").rmtree("/", ignore_errors=True)`. [Achtung, beides nicht ausprobieren. Das erste belegt ein paar Milliarden Terabyte an Arbeitsspeicher, das andere löscht deine Festplatte.]

`eval` führt den eingegebenen Text als Python-Code aus. Du willst aber wahrscheinlich einen String oder eine Zahl einlesen. `input` gibt von sich aus einen String zurück, da musst du also gar nichts weiter machen, und wenn du eine Zahl haben willst, musst du den String mit `int` oder `float` in eine Zahl umwandeln.