从模块中导入函数 back 和 fort

Import functions from modules back and fort

您好,我在模块中导入函数时遇到问题。我收到错误:

NameError: name 'main_menu' is not defined

我有 6 个模块(主、菜单、用户、书籍、汽车等)

在我的 main.py 我有 from menu import *

在我的 menu.py 我有:

from users import *
from books import *

现在,当我尝试将函数 main_menu()menu.py 导入到我的 users.py 我收到那个错误。

我记得我无法从模块来回导入函数。但是如何调用位于 menu.py 中的 main_menu() 函数呢?

我的问题确实是,如果我已经从当前模块导入了所有内容,我如何从其他模块导入和调用函数?

编辑:

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
>>>

您在 menuusers 模块之间进行了循环导入。由于您使用的是 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()

users.py:

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 中正常工作。

但在这种情况下,将您的一些模块简单地组合在一起可能是有意义的。如果您不需要命名空间分离(您显然不需要,因为您使用的是通配符导入),您不妨将所有内容放在同一个文件中。那么你就不会有循环导入的任何问题,因为你根本不会有任何导入。