input()-fout – NameError: naam ‘…’ is niet gedefinieerd

Ik krijg een foutmelding wanneer ik dit eenvoudige script probeer uit te voeren:

input_variable = input("Enter your name: ")
print("your name is" + input_variable)

Stel dat ik “dude” typ, de foutmelding die ik krijg is:

line 1, in <module>
input_variable = input("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined

Ik voer deze scripts uit met Python 2.7.


Antwoord 1, autoriteit 100%

TL;DR

input-functie in Python 2.7, evalueert alles wat je invoert, als een Python-expressie. Als je gewoon strings wilt lezen, gebruik dan de functie raw_inputin Python 2.7, die de gelezen strings niet zal evalueren.

Als je Python 3.x gebruikt, is raw_inputhernoemd naar input. Onder verwijzing naar de Python 3.0 release-opmerkingen,

raw_input()is hernoemd naar eval(input()). Dat wil zeggen, de nieuwe functie eval(input())leest een regel uit sys.stdinen retourneert deze met de achterliggende nieuwe regel gestript. Het verhoogt EOFErrorals de invoer voortijdig wordt beëindigd. Gebruik eval(input())

om het oude gedrag van eval(input())te krijgen.


In Python 2.7zijn er twee functies die kunnen worden gebruikt om gebruikersinvoer te accepteren. De ene is inputen de andere is raw_input. Je kunt de relatie daartussen als volgt bedenken

input = eval(raw_input)

Overweeg het volgende stukje code om dit beter te begrijpen

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

inputaccepteert een string van de gebruiker en evalueert de string in de huidige Python-context. Als ik dudetyp als invoer, blijkt dat dudegebonden is aan de waarde thefourtheyeen dus wordt het resultaat van de evaluatie thefourtheyeen dat wordt toegewezen aan input_variable.

Als ik iets anders invoer dat er niet is in de huidige python-context, zal het mislukken, de NameError.

>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined

Veiligheidsoverwegingen met de inputvan Python 2.7:

Aangezien de gebruikerstypen ook worden geëvalueerd, legt het ook veiligheidskwesties op. Als u bijvoorbeeld al os-module in uw programma hebt geladen met import os, en vervolgens de gebruikerstypen in

os.remove("/etc/hosts")

Dit wordt geëvalueerd als een functie-oproepuitdrukking door Python en zal worden uitgevoerd. Als u Python uitvoert met verhoogde privileges, wordt /etc/hostsbestand verwijderd. Zie, hoe gevaarlijk het zou kunnen zijn?

Laten we proberen dit te proberen input-functie opnieuw uit te voeren.

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

Nu, wanneer input("Enter your name: ")wordt uitgevoerd, het wacht op de gebruikersinvoer en de gebruikersinvoer is een geldige inroep van Python-functie en zo wordt ook aangeroepen. Daarom zien we Enter your name again:prompt opnieuw.

Dus, je bent beter af met raw_inputfunctie, zoals deze

input_variable = raw_input("Enter your name: ")

Als u het resultaat naar een ander type wilt converteren, kunt u de juiste functies gebruiken om de tekenreeks te converteren die wordt geretourneerd door raw_input. Om inputs bijvoorbeeld als gehele getallen te lezen, gebruikt u de intfunctie, zoals weergegeven in dit antwoord .

in Python 3.x , er is slechts één functie om gebruikersinangen te krijgen en dat wordt input, die gelijk is aan Python 2.7’s raw_input.


Antwoord 2, Autoriteit 21%

U loopt Python 2, niet Python 3. Hiervoor werkt u in Python 2, gebruik raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)

Antwoord 3, Autoriteit 7%

Omdat u aan het schrijven bent voor Python 3.x, wilt u beginnen met uw script met:

#!/usr/bin/env python3

Als u gebruikt:

#!/usr/bin/env python

Het zal standaard in Python 2.x. Deze gaan op de eerste regel van je script, als er niets is dat begint met #! (aka de Shebang).

Als uw scripts gewoon beginnen met:

#! python

Dan kunt u het wijzigen naar:

#! python3

Hoewel deze kortere opmaak alleen wordt herkend door een paar programma’s, zoals de launcher, dus het is niet de beste keuze.

De eerste twee voorbeelden zijn veel meer meer gebruikt en zullen helpen ervoor te zorgen dat uw code werkt op een machine die Python heeft geïnstalleerd.


Antwoord 4, Autoriteit 2%

Ik heb ook dit probleem tegengekomen met een module die compatibel was voor Python 2.7 en 3.7

Wat ik vond het probleem op te lossen, was importeren:

from six.moves import input

dit heeft de bruikbaarheid voor beide tolken verholpen

u kunt hier

meer lezen over de zes bibliotheken


Antwoord 5, autoriteit 2%

Je moet raw_inputgebruiken omdat je python-2.7 gebruikt. Wanneer u eval(input())op een variabele gebruikt (bijvoorbeeld: s = input('Name: ')), zal het de opdracht OP de Python-omgeving uitvoeren zonder op te slaan wat je hebt geschreven op de variabele (s) en een fout maakt als wat je hebt geschreven niet is gedefinieerd.

raw_input()zal correct opslaan wat u op de variabele hebt geschreven (bijvoorbeeld: f = raw_input('Name : ')), en het zal het niet uitvoeren in de Python-omgeving zonder een mogelijke fout te creëren:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))

Antwoord 6, autoriteit 2%

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Je moet invoer tussen enkele of dubbele aanhalingstekens invoeren

Ex:'dude' -> correct
    dude -> not correct

Antwoord 7, autoriteit 2%

Voor python 3 en hoger

s = raw_input()

het lost het probleem op pycharm IDE op
als je op een online site precies hackerrank oplost, gebruik dan:

s = input()

Antwoord 8

U kunt het volgende doen:

x = raw_input("enter your name")
print "your name is %s " % x

of:

x = str(input("enter your name"))
print "your name is %s" % x

Antwoord 9

We gebruiken het volgende dat zowel python 2 als python 3

werkt

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))

Antwoord 10

Voor iedereen die mogelijk tegen dit probleem aanloopt, blijkt dat zelfs als je #!/usr/bin/env python3aan het begin van je script opneemt, de shebang wordt genegeerd als het bestand is niet uitvoerbaar.

Om te bepalen of uw bestand al dan niet uitvoerbaar is:

  • voer ./filename.pyuit vanaf de opdrachtregel
  • als je -bash: ./filename.py: Permission deniedkrijgt, voer je chmod a+x filename.py
  • uit

  • voer ./filename.pyopnieuw uit

Als u import sys; print(sys.version)zoals Kevin suggereerde, je zult nu zien dat het script wordt geïnterpreteerd door python3


Antwoord 11

Goede bijdragen de vorige.

import sys; print(sys.version)
def ingreso(nombre):
    print('Hi ', nombre, type(nombre))
def bienvenida(nombre):
    print("Hi "+nombre+", bye ")
nombre = raw_input("Enter your name: ")
ingreso(nombre)
bienvenida(nombre)
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name: "))
Vul je naam in: Joe
('Hoi ', 'Joe', <typ 'str'>)
Hallo Joe, doei
Jouw naam: Joe
Joe

Bedankt!


Antwoord 12

Er zijn twee manieren om deze problemen op te lossen,

  • De eerste is eenvoudig zonder codewijziging, dat is
    voer je script uit met Python3,
    als je nog steeds op python2 wilt draaien, dan
    na het uitvoeren van uw python-script, houd er rekening mee wanneer u de invoer invoert

    1. als je stringwilt invoeren, begin dan gewoon te typen met “invoer gaat met dubbele aanhalingstekens” en het zal werken in python2.7 en
    2. als je tekens wilt invoeren, gebruik dan de invoer met een enkel aanhalingsteken, zoals ‘je invoer komt hier’
    3. als u een nummer wilt invoeren dat geen probleem is, typt u gewoon het nummer
  • Tweede manier is met codewijzigingen
    gebruik de onderstaande import en voer het uit met elke versie van python

    1. from six.moves import input
    2. Gebruik de functie raw_input()in plaats van de functie eval(input())in uw code bij elke import
    3. maak uw code schoon met de functie str()zoals str(input())en wijs deze vervolgens toe aan een willekeurige variabele

Zoals een fout impliceert:
naam ‘dude’ is niet gedefinieerd
dwz voor python wordt ‘kerel’ hier variabel en er wordt geen waarde van het door python gedefinieerde type toegewezen
dus alleen het huilt als een baby, dus als we een ‘kerel’-variabele definiëren en een waarde toewijzen en eraan doorgeven, zal het werken maar dat is niet wat we willen omdat we niet weten welke gebruiker zal invoeren en bovendien willen we de gebruikersinvoer vastleggen.

Feit over deze methode:
Functie eval(input()): deze functie neemt de waarde en het type van de invoer die u invoert zoals het is, zonder het type te wijzigen.
raw_input()
functie: Deze functie converteert expliciet de invoer die u geeft in type string,

Opmerking:
De kwetsbaarheid in de input()-methode ligt in het feit dat:
de variabele die toegang heeft tot de waarde van invoer is toegankelijk voor iedereen
gewoon door de naam van de variabele of methode te gebruiken.


Antwoord 13

Je kunt veranderen welke python je gebruikt met je IDE, als je python 3.x al hebt gedownload, zou het niet al te moeilijk moeten zijn om over te schakelen. Maar je script werkt prima op python 3.x, ik zou gewoon veranderen

print ("your name is" + input_variable)

naar

print ("your name is", input_variable)

Omdat het met de komma wordt afgedrukt met een spatie tussen your name isen wat de gebruiker ook heeft ingevoerd. EN: als je 2.7 gebruikt, gebruik dan gewoon raw_inputin plaats van invoer.


Antwoord 14

Hier is een invoerfunctie die compatibel is met zowel Python 2.7 als Python 3+:
(Enigszins aangepast antwoord door @Hardian) om UnboundLocalError: local variable 'input' referenced before assignment-fout

def input_compatible(prompt=None):
    try:
        input_func = raw_input
    except NameError:
        input_func = input
    return input_func(prompt)

Antwoord 15

Probeer raw_inputte gebruiken in plaats van inputals je gewoon strings wilt lezen.

print("Enter your name: ")
x = raw_input()
print("Hello, "+x)

Other episodes