2017-01-17 8 views
0

Привет У меня проблема с функциями импорта в моих модулях. Я получаю сообщение об ошибке:Импорт функций из модулей назад и форта

NameError: name 'main_menu' is not defined 

У меня есть 6 модулей (основные, меню, пользователи, книги, автомобили и т.д.)

В моем main.py Я имею from menu import *

В моем меню .py у меня есть:

from users import * 
from books import * 

И теперь, когда я пытаюсь импортировать функцию main_menu() от menu.py к моему users.py Я получаю эту ошибку.

Я помню, что каким-то образом я не могу импортировать функции из модулей. Но как я могу позвонить main_menu() функция, которая находится в menu.py чем?

Мой вопрос в том, как я могу импортировать и вызывать функцию из другого модуля, если я уже импортировал все из моего текущего модуля?

РЕДАКТИРОВАТЬ:

main.py

from menu import * 


def login(): 

    x = str(input("Username:")) 
    y = str(input("Password:")) 

    if x == "admin" and y == "admin": 
     main_menu() 
    else: 
     print('Wrong!') 
login() 

menu.py

from users import * 

def main_menu(): 
    print("Welcome to main menu:") 
    option = str(input("Enter option: ")) 
    if option == '1': 
     all_users() 

users.py

from menu import * 

def all_users(): 
    allusers = ["Mike", "John", "Nick"] 
    print(allusers) 
    backtomenu = str(input("Back to main menu: (Y/N) ")) 
    if backtomenu == "Y": 
     main_menu() 
    elif backtomenu == "N": 
     quit() 

ОШИБКА:

Username:admin 
Password:admin 
Welcome to main menu: 
Enter option: 1 
['Mike', 'John', 'Nick'] 
Back to main menu: (Y/N) Y 
Traceback (most recent call last): 
    File "C:\Users\Sm\Desktop\ss\main.py", line 13, in <module> 
    login() 
    File "C:\Users\Sm\Desktop\ss\main.py", line 10, in login 
    main_menu() 
    File "C:\Users\Sm\Desktop\ss\menu.py", line 7, in main_menu 
    all_users() 
    File "C:\Users\Sm\Desktop\ss\users.py", line 8, in all_users 
    main_menu() 
NameError: name 'main_menu' is not defined 
>>> 
+0

Предоставленная вами ошибка не соответствует указанным именам функций. Пожалуйста, отредактируйте и предоставите [mcve] и ошибку. – Julien

+0

@JulienBernu теперь все в порядке? – FrankieD

+0

Вместо того, чтобы говорить, что я это делаю, я делаю это, пожалуйста, поделитесь содержимым всех соответствующих сценариев. С небольшой информацией, которую вы делитесь, сложно сказать, если вы просто забываете об импорте или если этот (возможно) недостающий импорт создаст циклическую ссылку ... – Julien

ответ

0

У вас есть круговой импорт между menu и users модулей. Поскольку вы используете синтаксис from module import *, он не работает так, как вы планируете. Один из модулей пуст, когда вы пытаетесь импортировать все имена из него (поскольку он ждет другого на загрузку). Точно, какой модуль выходит из строя, будет зависеть от того, как внешний код сначала загружает эти модули.

Простым решением было бы использовать только базовый синтаксис import module вместо from module import * (импорт подстановочных знаков часто является плохой идеей в любом случае из-за загрязнения пространства имен).

Таким образом, вы можете попробовать:

menu.py:

import users 

def main_menu(): 
    print("Welcome to main menu:") 
    option = str(input("Enter option: ")) 
    if option == '1': 
     users.all_users() 

пользователей.ру:

import menu 

def all_users(): 
    allusers = ["Mike", "John", "Nick"] 
    print(allusers) 
    backtomenu = str(input("Back to main menu: (Y/N) ")) 
    if backtomenu == "Y": 
     menu.main_menu() 
    elif backtomenu == "N": 
     quit() 

Многие люди скажут вам, что круговой импорт явный признак плохой дизайн, и что вы всегда должны избавиться от них. Я, как правило, не так сильно на них нападает, потому что они могут отлично работать на Python, если вы их правильно исправьте.

Но в этом случае может иметь смысл просто объединить некоторые из ваших модулей. Если вам не требуется разделение пространства имен (чего явно не было, поскольку вы использовали импорт подстановочных знаков), вы могли бы также поместить все в один и тот же файл. Тогда у вас не будет проблем с циркулярным импортом, так как у вас вообще не будет импорта.

+0

Спасибо, я постараюсь совместить что-то с вашим ответом! – FrankieD