Почему я продолжаю получать эту большую ошибку в python. Обратная трассировка (самый недавний призыв последнего)... и AttributeError


Я изучаю python и получаю разные вещи из интернета и помещаю их все в эту игру, которую я делаю: "вы просыпаетесь..."Это текст на основе ASCI RPG (Roll playing game). Это работало, пока я не получил эту ошибку:

Traceback (most recent call last):
  File "C:UsersWilliamDesktopProgrammingProgramsYou wake upmain.py", line 16, in <module>
    import helper
  File "C:UsersWilliamDesktopProgrammingProgramsYou wake uphelper.py", line 13, in <module>
    import main
  File "C:UsersWilliamDesktopProgrammingProgramsYou wake upmain.py", line 103, in <module>
    init()
  File "C:UsersWilliamDesktopProgrammingProgramsYou wake upmain.py", line 41, in init
    game_text()
  File "C:UsersWilliamDesktopProgrammingProgramsYou wake upmain.py", line 77, in game_text
    helper.way_out_quest()
AttributeError: 'module' object has no attribute 'way_out_quest'

Это основной файл (main.py):

#-------------------------------------------------------------------------------
# Name:        main.py
# Purpose:     An RPG (Roll playing game) where you wake up in a room and have
#              to figure out text based puzzles to escape.
#              The whole game will be done in a terminal (Shell) and will be
#              completely text and assci code. This will be the main file.
#
# Author:      William
#
# Created:     15/12/2013
# Copyright:   (c) William 2013
#-------------------------------------------------------------------------------

import time
import assci
import helper

#Non-maluable variables:
__name__ = '__main__'
#Maluable variables:

#Error message if main.py is called from a different file
if __name__ != '__main__':
    print("[ERROR]: main.py is the main file and should not be called by any other file.")
    time.sleep(3)
    exit()

#The function that starts/restarts the game
def init():
    """
    Calls all the functions to start the game/ restart the game
    """
    #Display a cool banner
    assci.ywu_banner(2)

    START_INPUT = input("Press ENTER/RETURN on your keyboard to start the game")
    time.sleep(0.7)
    assci.clear()

    #Game text.
    game_text()

#The text which is the main story line after the banner which gives the player
#A sense of what the setting is about
def game_text():
    """
    Prints out a bit of text 2 lines down and clears the screen every 4 or so
    seconds.
    """
    time.sleep(5)

    print("nnYour eyes gradually open")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

    print("nnAfter waking up, you slowly gather your senses and sit up...")
    time.sleep(4.5)
    assci.clear()
    time.sleep(2)

    print("nnYou look around the room, and unexpectidly, you realise your in some sort of a prison cell!")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

    print("nnIt's a sqaure room made of iron.")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

    print("nnHow did I get here? -You think to yourself")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

    helper.way_out_quest()

    assci.clear()
    time.sleep(2)

    print("nnYou see a wooden door with 5 buttons and a handel...  " + assci.WOODEN_DOOR)
    time.sleep(6)
    assci.clear()
    time.sleep(2)

    print("nnWhat was that? ...you think to your self.")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

    print("nnWhat was that? ...you think to your self.")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

    print("nnYou look around the room and walk slowly towards the iron door..")
    time.sleep(4)
    assci.clear()
    time.sleep(2)

#Call init() function to start the game (init = initiate)
init()

Helper.py:

#-------------------------------------------------------------------------------
# Name:        helper
# Purpose:     To contain helper functions for the game "Yoy wake up..."
#
# Author:      William
#
# Created:     17/12/2013
# Copyright:   (c) William 2013
#-------------------------------------------------------------------------------

import time
import assci
import main

#Error message if user executes the wrong file.
if __name__ == '__main__':
    print("[ERROR]: Do not run this file. Run main.py - this file should not be executed!")
    time.sleep(4)
    exit()

#Function for the first quest: do you want to find a way out?
def way_out_quest():
    """
    If the question is not answered, then the player can't move on. If they say
    yes, then they continue through the script. If they say no, then the init
    function is called from main.py
    """
    way_out_answered = False
    while way_out_answered == False:
        WAY_OUT_INPUT = input("Quest: Do you want to find a way out? ")
        if WAY_OUT_INPUT in ["yes", "Yes", "YES"]:
            way_out_answered = True

        elif WAY_OUT_INPUT in ["no", "No", "NO"]:
            way_out_answered = True
            time.sleep(2)
            assci.clear()
            print("GAMEnOVER!")
            time.sleep (5)
            assci.clear()
            main.init()

        else:
            print("Type yes or no. ")

        time.sleep(4)

Это файл ASCI со всеми функциями art / clear и text и прочее (assci.py):

#-------------------------------------------------------------------------------
# Name:        assci
# Purpose:     To create all the assci art and graphic tools for the game:
#              "you wake up..."
#
# Author:      William Bryant
#
# Created:     15/12/2013
# Copyright:   (c) William 2013
#-------------------------------------------------------------------------------

import time
import os

WOODEN_DOOR = """ ______________________________
/_____/_____/_____/_____/_____/
 ._.                    ._.
 | |                    | |
 |_|   ______   ______  |_|
 |-|  /_____/  /_____/  |-|
 | |                    | |
 |_|                    |_|
 ._.                    ._.
 | |                    | |
 |_|   ______           |_|
 |-|  /_____/           |-|
 | |              /    | |
 |_|              /    |_|
 ._.                    ._.
 | |                    | |
 |_|   ______   ______  |_|
 |-|  /_____/  /_____/  |-|
 | |                    | |
 |_|                    |_|

  ______   ______   ______   ______   ______   ______   ______   ______
 /_____/  /_____/  /_____/  /_____/  /_____/  /_____/  /_____/  /_____/
 /_____/  /_____/  /_____/  /_____/  /_____/  /_____/  /_____/  /_____/"""

#Error message if user executes the wrong file.
if __name__ == '__main__':
    print("[ERROR]: Do not run this file. Run main.py - this file should not be executed!")
    time.sleep(4)
    exit()

#Clear function
def clear():
    """
    Clears the console screen using the built in commands on a operating
    system (here linux and windows)
    """
    os.system(['clear','cls', "^L"][os.name == 'nt'])

#"Wake up..." title/banner at the start
def ywu_banner(num_of_times):
    """
    Prints You wake up...(the game name) in ascii code big letters into a
    console and clears the screen using the clear function above and reprints
    the message to make the dots at the end appear to be moving.
    """
    print("__     __                         _")
    time.sleep(0.25)
    print("    / /                        | |")
    time.sleep(0.25)
    print("  _/ /__  _   _  __      ____ _| | _____   _   _ _ __")
    time.sleep(0.25)
    print("     / _ | | | |   / / / _` | |/ / _  | | | | '_  ")
    time.sleep(0.25)
    print("   | | (_) | |_| |   V  V / (_| |   <  __/ | |_| | |_) | _ _ ")
    time.sleep(0.25)
    print("   |_|___/ __,_|   _/_/ __,_|_|____|  __,_| .__(_|_|_)")
    time.sleep(0.25)
    print("                                                  | |    ")
    time.sleep(0.25)
    print("                                                  |_| ")
    time.sleep(0.25)
    clear()

    for foo in range(num_of_times):
        print("__     __                         _")
        print("    / /                        | |")
        print("  _/ /__  _   _  __      ____ _| | _____   _   _ _ __")
        print("     / _ | | | |   / / / _` | |/ / _  | | | | '_  ")
        print("   | | (_) | |_| |   V  V / (_| |   <  __/ | |_| | |_) | _  ")
        print("   |_|___/ __,_|   _/_/ __,_|_|____|  __,_| .__(_|_)")
        print("                                                  | |    ")
        print("                                                  |_| ")
        time.sleep(0.7)
        clear()

        print("__     __                         _")
        print("    / /                        | |")
        print("  _/ /__  _   _  __      ____ _| | _____   _   _ _ __")
        print("     / _ | | | |   / / / _` | |/ / _  | | | | '_  ")
        print("   | | (_) | |_| |   V  V / (_| |   <  __/ | |_| | |_) |  ")
        print("   |_|___/ __,_|   _/_/ __,_|_|____|  __,_| .__(_)")
        print("                                                  | |    ")
        print("                                                  |_| ")
        time.sleep(0.7)
        clear()

        print("__     __                         _")
        print("    / /                        | |")
        print("  _/ /__  _   _  __      ____ _| | _____   _   _ _ __")
        print("     / _ | | | |   / / / _` | |/ / _  | | | | '_  ")
        print("   | | (_) | |_| |   V  V / (_| |   <  __/ | |_| | |_) |  ")
        print("   |_|___/ __,_|   _/_/ __,_|_|____|  __,_| .___/")
        print("                                                  | |    ")
        print("                                                  |_| ")
        time.sleep(0.7)
        clear()

        print("__     __                         _")
        print("    / /                        | |")
        print("  _/ /__  _   _  __      ____ _| | _____   _   _ _ __")
        print("     / _ | | | |   / / / _` | |/ / _  | | | | '_  ")
        print("   | | (_) | |_| |   V  V / (_| |   <  __/ | |_| | |_) | _ _ ")
        print("   |_|___/ __,_|   _/_/ __,_|_|____|  __,_| .__(_|_|_)")
        print("                                                  | |    ")
        print("                                                  |_| ")
        time.sleep(0.7)
        clear()

    START = input("Press ENTER/RETURN on your keyboard to start the game")
    time.sleep(0.7)
    clear()
1 3

1 ответ:

Ваш init() вызов в main.py должен быть в блоке if __name__ == '__main__':, и вы должныне устанавливать __name__ самостоятельно - Python сделает это автоматически.

В противном случае ваш циклический импорт приведет к тому, что helper не будет импортирован должным образом до вызова init(). Последовательность в ее нынешнем виде выглядит следующим образом:

  1. ты бежишь main.py, которая начинается main.py быть оцененным.
  2. строка import helper в main.py старты helper.py его оценивают.
  3. строка import main в helper.py начинается очередная оценка main.py потому что модуль main ранее не былимпортирован .
  4. строка import helper во второй оценке main.py импортирует существующий вспомогательный объект, который был создан, когда #2 начал импортировать вспомогательный объект, поэтому это не создает бесконечный цикл - но существующий вспомогательный объект еще не полностью загружен; он все еще ждет разрешения импорта main.
  5. вторая оценка main попадает в вызов init() в нижней части main.py, который пытается запустить init() - но helper по-прежнему не выполняется загрузка, и таким образом функция way_out_quest в helper.py еще не был оценен и, следовательно, не определен.

Вообще, лучше всего избегать кругового импорта в первую очередь - тогда вам не придется беспокоиться о подобных проблемах.