Error "mismatched input" expecting DEDENT
Following this tutorial I got the following error where y = 1; I'm using Netbeans 6.5 for Python. thanks
y=1
^
SyntaxError: line 8:3 mismatched input '' expecting DEDENT (temperatureconverter.py, line 8)
the following is the python code, format it for me thanks.
__author__="n"
__date__ ="$Jan 开发者_高级运维9, 2011 3:03:39 AM$"
def temp():
print "Welcome to the NetBeans Temperature Converter."
y=1
n=0
z=input("Press 1 to convert Fahrenheit to Celsius, 2 to convert Celsius to Fahrenheit, or 3 to quit:")
if z!=1 and z!=2 and z!=3:
e=input("Invalid input, try again?(y or n)")
if e==1:
t=''
temp()
if e==0:
t="Thank you for using the NetBeans Temperature Converter."
print "Celsius Fahrenheit" # This is the table header.
for celsius in range(0,101,10): # Range of temperatures from 0-101 in increments of 10
fahrenheit = (9.0/5.0) * celsius +32 # The conversion
print celsius, " ", fahrenheit # a table row
temp()
In the print
statement you used 2 spaces to indent the line, while in the next one you put 3 spaces.
Whitespace is significant in Python. Specifically, if you have a certain level of indentation in one line you can't just use another one for the next line.
For interest's sake here is an extended version of the example. I have incorporated a certain amount of magic which may lead you to a deeper understanding of Python!
And - as I am always glad to continue learning - does anyone else have suggestions on how this ought to be be extended and improved in a correctly Pythonic manner?
class MenuItem(object):
def __init__(self, fn, descr=None, shortcuts=None):
"""
@param fn: callable, callback for the menu item. Menu quits if fn returns False
@param descr: str, one-line description of the function
@param shortcuts: list of str, alternative identifiers for the menu item
"""
if hasattr(fn, '__call__'):
self.fn = fn
else:
raise TypeError('fn must be callable')
if descr is not None:
self.descr = descr
elif hasattr(fn, '__doc__'):
self.descr = fn.__doc__
else:
self.descr = '<no description>'
if shortcuts is None:
shortcuts = []
self.shortcuts = set(str(s).lower() for s in shortcuts)
def __str__(self):
return self.descr
def hasShortcut(self,s):
"Option has a matching shortcut string?"
return str(s).lower() in self.shortcuts
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
class Menu(object):
def __init__(self):
self._opts = []
def add(self, od, *args, **kwargs):
"""
Add menu item
can be called as either
.add(MenuItem)
.add(args, to, pass, to, MenuItem.__init__)
"""
if isinstance(od, MenuItem):
self._opts.append(od)
else:
self._opts.append(MenuItem(od, *args, **kwargs))
def __str__(self, fmt="{0:>4}: {1}", jn='\n'):
res = []
for n,d in enumerate(self._opts):
res.append(fmt.format(n+1, d))
return jn.join(res)
def match(self, s):
try:
num = int(s)
if 1 <= num <= len(self._opts):
return self._opts[num-1]
except ValueError:
pass
for opt in self._opts:
if opt.hasShortcut(s):
return opt
return None
def __call__(self, s=None):
if s is None:
s = getStr(self)
return self.match(s)
def fahr_cels(f):
"""
@param f: float, temperature in degrees Fahrenheit
Return temperature in degrees Celsius
"""
return (f-32.0)/1.8
def cels_fahr(c):
"""
@param c: float, temperature in degrees Celsius
Return temperature in degrees Fahrenheit
"""
return (c*1.8)+32.0
def getFloat(msg=''):
return float(raw_input(msg))
def getStr(msg=''):
print(msg)
return raw_input().strip()
def doFahrCels():
"Convert Fahrenheit to Celsius"
f = getFloat('Please enter degrees Fahrenheit: ')
print('That is {0:0.1f} degrees Celsius'.format(fahr_cels(f)))
return True
def doCelsFahr():
"Convert Celsius to Fahrenheit"
c = getFloat('Please enter degrees Celsius: ')
print('That is {0:0.1f} degrees Fahrenheit'.format(cels_fahr(c)))
return True
def doQuit():
"Quit"
return False
def makeMenu():
menu = Menu()
menu.add(doFahrCels, None, ['f'])
menu.add(doCelsFahr, None, ['c'])
menu.add(doQuit, None, ['q','e','x','quit','exit','bye','done'])
return menu
def main():
print("Welcome to the NetBeans Temperature Converter.")
menu = makeMenu()
while True:
opt = menu()
if opt is None: # invalid option selected
print('I am not as think as you confused I am!')
else:
if opt() == False:
break
print("Thank you for using the NetBeans Temperature Converter.")
if __name__=="__main__":
main()
Use Preferences->Pydev->Editor and uncheck replace tabs with spaces. Tabs can be 4 spaces despite popular opinion that it should be changed to 8 spaces. It removes all detent errors.
Yea this is what did it for me. I was playing around in Notepad++ with a .py file that was made in Eclipse, Eclipse was using spaces and I was using tabs. It looked the same as 4 spaces = 1 tab so I just used spaces instead of tabs and all was well.
Nevermind the problem went away with the complete code. sorry
def temp():
print "Welcome to the NetBeans Temperature Converter."
y=1
n=0
z=input("Press 1 to convert Fahrenheit to Celsius, 2 to convert Celsius to Fahrenheit, or 3 to quit:")
if z!=1 and z!=2 and z!=3:
e=input("Invalid input, try again?(y or n)")
if e==1:
t=''
temp()
if e==0:
t="Thank you for using the NetBeans Temperature Converter."
if z==1: # The user wishes to convert a temperature from Fahrenheit to Celsius
x=input("Input temperature in Fahrenheit:")
t=(x-32)/1.8
print "The temperature in Celsius is:"
if z==2: # The user wishes to convert a temperature from Celsius to Fahrenheit
x=input("Input temperature in Celsius:")
t=(x*1.8)+32
print "The temperature in Fahrenheit is:"
if z==3: # The user wishes to quit the application
t="Thank you for using the NetBeans Temperature Converter."
print t
if z==1 or z==2:
a=input("Do you want to perform another conversion?(y or n)")
if a==0:
t="Thank you for using the NetBeans Temperature Converter."
if a==1:
t= ''
temp()
print t
temp()
精彩评论