type Befehl funktioniert bei Strings nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
stii
User
Beiträge: 1
Registriert: Sonntag 7. Februar 2021, 18:50

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
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

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.
Antworten