2 votes

Erreur d'indentation inattendue en Python main()

Je n'ai aucune idée de la façon de résoudre ce problème. J'ai essayé de retaper le programme.

Je reçois une erreur d'indentation inattendue pour la dernière fonction principale.

resident = 81
nonresident = 162

def main():

    # initialize counters and total tuition
    resident_counter = 0
    nonresident_counter = 0
    total_tuition = 0

    print("Name \tCode\tCredits\tTuition")
    print

    try:
        # open the data file
        infile = open('enroll.txt', 'r')

        # read the first value from the file
        student_name = infile.readline()

        # continue reading from file until the end
        while student_name != '':

            # strip the new line character and print the student's name
            student_name = student_name.rstrip('\n')
            print(student_name, end='\t')

            # read the code type, strip the new line, and print it
            code = infile.readline()
            code = code_type.rstrip('\n')
            print(code_type, end='\t')

            # read the number of credits, strip the new line, and print it
            credits = infile.readline()
            credits = int(credits)
            print(format(credits, '3.0f'), end='\t')

            # check the room type and compute the rental amount due 
            # increment the appropriate counter
            if code_type == "R" or room_type == "r":
                payment_due = credits * resident
                resident_counter += 1
            elif code_type == "N" or room_type == "n":
                payment_due = credits * nonresident
                nonresident_counter += 1
            elif code_type != "R" or code_type != "r" or code_type != "N" or code_type != "n":
                payment_due = 0

            # accumulate the total room rent
            tuition += payment_due

            # print the appropriate detail line
            if payment_due == 0:
                print('invalid code')
            else:
                print('$', format(tuition, '8,.2f'))

            # get the next studen't name
            student_name = infile.readline()

        # close the input file
        infile.close()

        # print the counters and payment total amount
        print
        print('total number of resident students: ', resident_counter)
        print('total number of nonresident: ', nonresident_counter)
        print
        print('total students: ', end='')
        print('$', format(tuition, ',.2f'))
# execute the main function

main()

6voto

Lev Levitsky Points 25303

Vous n'avez pas de except pour correspondre à la clause try .

5voto

abarnert Points 94246

Malgré ce que tout le monde dit, si vous avez une try vous n'avez pas besoin d'avoir une except : vous devez avoir un except ou un finally .

Cela peut sembler pointilleux, mais il est tout à fait plausible que le code que vous copiez utilisait en fait finally (par exemple, pour s'assurer qu'un code de nettoyage est toujours exécuté - étant donné qu'il fait un nettoyage manuel à la C-/Java).

En tout cas, l'ajout d'un except La clause n'est pas la bonne réponse. Si vous cherchez à gérer ou ignorer les erreurs, alors oui, ajoutez une clause de type except clause. Si vous cherchez un endroit où ajouter du code de nettoyage qui sera exécuté même en cas d'erreur, ajoutez une clause finally à la place. Si vous ne voulez ni l'un ni l'autre, supprimez simplement la clause try ligne.

2voto

melissa Points 21

Vous mélangez le type de pièce et le type de code dans votre déclaration if else. Il vous manque également l'instruction except. Cela devrait être vos deux dernières lignes avant d'appeler main.

Il faut lire :

except IOError:
    print('an error occurred trying to open or read enroll.txt')

1voto

alexvassel Points 2279

Vous utilisez l'instruction try. Cela signifie que vous DEVEZ avoir un bloc except.

try:
    some code
except:
    pass

C'est une simplification, mais qui résoudra votre problème.

1voto

Matthew Adams Points 3528

Les autres réponses ont (correctement) souligné que vous devez avoir une except pour aller avec votre try: (ou ne pas utiliser un try tout à fait). Je vais try pour expliquer comment vous pourriez déboguer des problèmes similaires à l'avenir, car ils peuvent être très ennuyeux à déboguer.

Votre message d'erreur ressemble très probablement à ceci :

  File "test.py", line 74
    main()
    ^
IndentationError: unexpected unindent

À première vue, cela ne semble pas très utile, et ce n'est certainement pas très clair.

Le fait que vous ayez "essayé de retaper le programme" semble indiquer que vous avez vu IndentationError et je me suis dit : "Cela signifie que mes retraits sont mal faits ; il y a peut-être un espace supplémentaire quelque part ou un mélange d'espaces et de tabulations ou quelque chose comme ça". Ceux-ci sont définitivement valides IndentationError et le fait de retaper le programme les corrigeait, si vous ne commettiez pas à nouveau la même erreur de frappe. (En passant, je crois que tout éditeur de texte digne de ce nom aura l'option de convertir toutes vos tabulations en 4 espaces pour éviter bien des maux de tête liés à l'indentation).

Cependant, en regardant le texte d'erreur, nous voyons "unexpected unindent". Pour moi, cela ressemble à du charabia, mais cela signifie que, lorsque python a examiné votre programme, il est tombé sur une ligne qui, selon lui, devait être indentée plus qu'elle ne l'était. (Malheureusement, ce même type d'erreur peut être appelé "unexpected unindent" ou "expected an indented block", et il peut même apparaître comme une vieille erreur de type SyntaxError: invalid syntax .)

Sachant ce que signifie le message d'erreur, nous pouvons revenir en arrière dans le code pour voir pourquoi python a pensé que main() a été indenté de façon étrange - bien que nous devions être prudents car python ne sait pas toujours où se trouve réellement le problème. Voici quelque chose qui ressemble à mon processus de pensée :

  • Il y a une définition de fonction juste avant main() est appelé, peut-être que cette fonction veut main() pour être à l'intérieur ? Non, ce n'est pas ça, car python ne s'attend à ce qu'il y ait au moins une ligne de code après une définition de fonction.
  • Quoi d'autre "veut" que le code soit indenté après lui ? if , elif et while tous le font, mais tous ont aussi un code après eux.
  • Le seul autre "indenteur" est try: . A ce stade, vous savez soit que try: doit être suivi d'un except: ou un finally: et vous le réparez, ou pas. Si vous ne savez pas ça, alors vous pouvez toujours voir que try: est suivi d'un bloc indenté, et, étant donné qu'il s'agit d'un coupable probable de votre erreur, vous décidez qu'il est temps de chercher ce que signifie le terme try: fait.

J'espère que cela vous aidera à résoudre des problèmes de ce genre à l'avenir. Consultez la réponse d'abarnert et mon lien pour en savoir plus sur la gestion des erreurs avec la fonction try / except / else / finally déclarations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X