从模块中导入函数 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
>>>
您在 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()
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 中正常工作。
但在这种情况下,将您的一些模块简单地组合在一起可能是有意义的。如果您不需要命名空间分离(您显然不需要,因为您使用的是通配符导入),您不妨将所有内容放在同一个文件中。那么你就不会有循环导入的任何问题,因为你根本不会有任何导入。
您好,我在模块中导入函数时遇到问题。我收到错误:
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
>>>
您在 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()
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 中正常工作。
但在这种情况下,将您的一些模块简单地组合在一起可能是有意义的。如果您不需要命名空间分离(您显然不需要,因为您使用的是通配符导入),您不妨将所有内容放在同一个文件中。那么你就不会有循环导入的任何问题,因为你根本不会有任何导入。