Input in Variable umwandeln

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
User12345
User
Beiträge: 3
Registriert: Samstag 30. April 2022, 07:02

Hi, ich, als Python-Anfänger, hätte eine Frage. Wie kann ich einen Input in eine Variable umwandeln?
z.B

Code: Alles auswählen

eingabe = input("Deine Variable: ")
wenn man in "eingabe" a=6 eingibt,

Code: Alles auswählen

>>> Deine Variable: a=6 
dass python eine neue variable "a" anlegt und sie dem Wert 6 zuteilt.
Würde das irgendwie gehen? Ich würde mich freuen.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

vllt hilft es dir, wenn du dir mal den Inhalt der Variablen ‚Eingabe‘ ausgeben lässt.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht so nicht und ist auch nicht sinnvoll. Denn Variablen helfen dir nur, wenn du gleichzeitig Code generieren könntest, der etwas mit den Variablen macht.

Wenn man eine unbekannte Anzahl von Werten anlegen und verarbeiten will, nutzt man dazu Wörterbücher. In einem Rutsch kannst du die aber nicht befüllen, eine Eingabe deiner Form musst du zuerst am Gleichheitszeichen zerlegen, und dann den linken Teil als Schlüssel und den rechten als wert behandeln.
Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was __deets__ beschrieben hat als Code, allerdings ohne Fehlerbehandlung:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    variablen = {}
    name, _, wert_text = input("Deine Variable: ").partition("=")
    variablen[name.strip()] = int(wert_text)
    print(variablen)


if __name__ == "__main__":
    main()
Testlauf:

Code: Alles auswählen

Deine Variable: a=6
{'a': 6}
Man möchte da natürlich noch darauf reagieren das kein "=" eingegeben wurde, der Text nach dem "=" nicht in eine ganze Zahl gewandelt werden kann, und vielleicht auch den Text vor dem "=" auf Kriterien testen, die ein Name erfüllen soll/muss.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Das ist möglich, aber eigentlich will man nicht.
Ein David Copperfield würde das sicherlich anders sehen...


Wenn man also jemanden ärgern will, lässt man die Begründung einfach weg und liefert dann so ein Beispiel:

Code: Alles auswählen

def input_eval(assignment):
    if "=" not in assignment:
        raise ValueError("Nur zuweisungen sind zulässig")
    if assignment.count("=") > 1:
        raise ValueError("Nur ein Gleichheitszeichen ist zulässig")
        
    name, evaluate = assignment.split("=")
    globals()[name] = eval(evaluate)
1) Ich würde mich nicht darauf verlassen, dass eval alles herausfiltert, was später genutzt werden kann, um die Anwendung zu kompromittieren.
2) global sollte nicht verwendet werden, da sich dort Fehler einschleichen, die nur schwer zu debuggen sind.
3) Zu Risiken oder Nebenwirkungen zählen sie die Anzahl der globals
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@DeaD_EyE: eval ist doch hier gar nicht nötig. Das Du hier globals ins Spiel bringst ist trotz der Warnung schon problematisch genug. Mit exec wird Deine Funktion zum Einzeiler, aber hier nochmal die Warnung: exec bringt noch mehr Probleme, nicht für Benutzereingaben verwenden.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

@DeaD_EyE: eval ist doch hier gar nicht nötig.
Besser als exec!

Beispiel mit exec:

Code: Alles auswählen

exec(input("Bitte Code eingeben:" ))
Und dann kann man z.B. folgenden Eingabe tätigen: import os; print(os.listdir())
Genauso gut könnte man das Home-Verzeichnis löschen.
Interessant ist das aber erst, wenn der Code z.B. irgendwo unbeobachtet auf einem Server läuft.
Dann wäre es z.B. fatal, wenn man denkt eval/exec sei sicher.

Kinder müssen auf die heiße Herdplatte packen, um zu spüren, dass es eine doofe Idee ist.
Man kann versuchen, den Kindern anhand von Beispielen aufzuzeigen, was dann passiert.
Wenn man den Kindern aber alles einfach nur verbietet und sagt, das ist schlecht, dann hören die Kinder nicht darauf.
Erklärt man dem Kind das warum, dann wird Kind eher auf einen hören.

Um eval und exec sicherzumachen, muss man sich ganz schön anstrengen und Python hervorragend kennen.
Darüber gibt es sogar gute Artikel. Aber das trägt jetzt nicht zur Lösung bei, da die Lösung eine andere ist, wo exec/eval nicht drin vorkommt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@DeaDEye: und was ist da der Unterschied zwischen `exec` und `eval`?

Code: Alles auswählen

eval("print(__import__('os').listdir())") 
Antworten