Wenn ich versuche, dies auszuführen, sagt NameFehler: Name 'verschlüsseln' ist nicht definiert.Python NameError: Name 'verschlüsseln' ist nicht definiert
Antwort
Von dem, was ich von Ihrem Code verstehe, ist "verschlüsseln" ein String-Wert. Sie müssen eine Liste mit den erforderlichen Zeichenfolgenwerten erstellen und prüfen, ob die Modusvariable mit einem Wert in dieser Liste übereinstimmt.
MAX_KEY_SIZE=26
def getMode():
while True:
mode=input().lower()
if mode in ['encrypt','e','decrypt','d']:
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
Wenn Sie die .split() -Methode verwenden möchten, können Sie folgendes tun:
if mode in "encrypt e decrypt d".split()
oder "verschlüsseln und entschlüsseln d" .split() 'das macht die Liste an Ort und Stelle. –
Zusätzlich könnte man 'ALLOWED_ANSWERS = ['encrypt', 'e', 'decrypt', 'd']' und dann 'if mode in ALLOWED_ANSWERS:' und danach 'print (" Enter "entweder" + "oder". join (ALLOWED_ANSWERS) + ".") 'oder vielleicht sogar' print ("Entweder" + "oder" .join ('' '+ i +' '' für i in ALLOWED_ANSWERS) + ".") ' – glglgl
Während dies löst ein Problem, es löst nicht den 'NameError', dem Nic Pismiris begegnet. Siehe dazu [pogos Antwort] (https://stackoverflow.com/questions/38631474/38631721#38631721). (Für das, was es wert ist, bin ich auch darauf hereingefallen.) –
Gotcha! input
versucht, Ihre Eingabe zu überprüfen (als solche wird es sehr irreführend genannt). Verwenden Sie raw_input
zum Erfassen von Benutzerwünschen im String-Format.
Im Grunde, was input
tut, ist es nimmt raw_input
und Rohren es eval
: jetzt bist du versucht, eine Zeichenfolge „verschlüsseln“, wie Python-Code zu bewerten, so dass es die gleiche Wirkung hat wie das Schreiben „verschlüsseln“, um die Dateien. Natürlich würde dies zu einem Fehler führen, da keine solche Variable irgendwo eingeführt wird. Sowohl eval
als auch input
sind ziemlich gefährliche Sachen, also versuche sie nicht zu benutzen, es gibt sehr selten einen echten Anwendungsfall für sie.
Weitere Informationen zu diesem Unterschied um diese Seite: https://stackoverflow.com/a/15129556/308668
Guter Fang. Ich sah 'print'-Funktionen in Klammern und nahm an, dass der Code Python3 war (wie es die meisten anderen taten, scheint es ...). –
MAX_KEY_SIZE = 26
def getMode():
while True:
print ('Do you wish to encrypt or decrypt a message?')
mode = input().lower()
if mode in "encrypt" 'e' 'decrypt' 'd'.split():
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
Hoffnung ist dies Ihr Code .. wenn ja, dann sollte es keine Fehler geben, auch die Methode, die Sie versuchen, das Ergebnis zu erhalten wird angeblich nicht Ihren Zweck lösen, weil "encrypt" 'e' 'decrypt' 'd'.split()
Ihnen ['encryptedecryptd']
geben wird und Sie nicht Modus durch "in" Methode suchen können, die Sie versuchen. Entweder können Sie wie folgt suchen: if any(mode in s for s in "encrypt" 'e' 'decrypt' 'd'.split()): or you can store
"encrypt" 'e' 'entschlüsseln' 'd'`in der Liste und verwenden Sie dann" in "-Methode, um mit der Eingabe des Benutzers übereinzustimmen.
Hoffe, es hilft ..
Dies löst nicht den 'NameError', der von' Python 2' erzeugt wird. (Nic Pismiris hat nicht angegeben, welche Version von Python er verwendet hat, aber "Input" von Python 3 wird diesen Fehler nicht erzeugen.) –
Auch, falls vorhanden (Modus in s für s in .... split()): 'wird iterieren über die gleiche Liste von einer Zeichenfolge, so dass es im Grunde das gleiche wie' if Modus in 'encryptedecryptd': '. Es wird also "True" zurückgeben, wenn "mode" "encrypt" ist, aber auch wenn es "ted" oder "cry" oder "edecr" ist. Ihre letzte Option --- eine Liste erlaubter Strings --- ist viel genauer. –
Danke Kevin für den Anwendungsfall, wo ** "any" ** fehlschlägt, auch auf den Code schauend, es ist klar, dass der Code in ** python 3 ** geschrieben ist, auch mit Eingabe() wird ** "NameError" geben ** wie im Fall von ** Python 3 **, wenn der Benutzer die Eingabe einer Zeichenkette oder eines Zeichens übernehmen muss, muss der Benutzer die Eingabe entweder in ** double quote/single quote ** einschließen, also im obigen Fall sollte die Eingabe erfolgen be: ** "Verschlüsseln" ** statt nur ** Verschlüsseln **. – Sumit
Erweiterung auf pogo's answer, was richtig ist ...
Was mich überrascht (und anscheinend viele andere) ist, dass die Gruppe von Zeichenfolgen in der if mode in ...:
Linie ist nicht ein Syntaxfehler
if mode in "encrypt" 'e' 'decrypt' 'd'.split():
Diese Strings sind alle Kompilierung-Konstanten, so string literal concatenation klebt sie in eine Zeichenfolge vor der Ausführung beginnt:
>>> "encrypt" 'e' 'decrypt' 'd'
'encryptedecryptd'
Die split()
Methode dann auf dieser Zeichenfolge aufgerufen, die zufällig tut enthält keine Leerzeichen. Der Rückgabewert ist eine Liste eine einzelne Zeichenfolge enthält:
>>> "encrypt" 'e' 'decrypt' 'd'.split()
['encryptedecryptd']
Der in
Betreiber nicht beschweren sich über eine Zeichenfolge (mode
) und eine Liste von Strings angegeben werden, aber es wird False
Rückkehr für jeden Wert von mode
außer Eins ... welches wahrscheinlich niemand tippen wird:
>>> 'encrypt' in ['encryptedecryptd']
False
>>> 'encryptedecryptd' in ['encryptedecryptd']
True
Verwenden Sie Python 2 oder Python 3?Die 'print'-Funktionen sehen wie 3 aus, aber der' NameError', den du bekommst, würde von der 2-Version von 'input' kommen. (Siehe [progos Antwort] (https://stackoverflow.com/questions/38631474/38631721#38631721) für, warum es wichtig ist.) –
Es scheint, dass dies Python 2-Code ist, mit einem 'von __future__ Import print_function' das ist nicht ' t hier gezeigt. –