#python
#питон
Вопрос:
Последние несколько дней я пробовал python и для развлечения кодировал базовую терминальную штуковину. Я решил перенести свои функции в другие файлы и использовать import
функцию для их подключения. Моя среда разработки (repl.it ) говорит мне, что я могу просто импортировать имя файла и вызывать функции в моем main.py , но встроенный интерпретатор выдает мне ошибку имени. Вот мой код:
main.py
import functions
def terminal() :
command = input('')
if command == 'login' :
functions.login()
if command == 'logout' :
functions.logout()
if command == 'info' :
info.info()
print('Welcome to the terminal. Please start by entering a command.')
terminal()
functions.py
import main
def login() :
enteredcode = input('Enter Passcode: ')
if enteredcode == code[0] :
loggedIn == True
print('Login Successful!')
print('Logged in as: ' user[0])
main.terminal()
if enteredcode == code[1] :
loggedIn == True
print('Login Successful!')
print('Logged in as: ' user[1])
main.terminal()
else :
print('Incorrect Code. Please Try Again.')
login()
def logout() :
if loggedIn == True :
loggedIn == False
print('Logged Out.')
main.terminal()
return
elif loggedIn == False :
print('You are already logged out.')
main.terminal()
user = ['user1', 'user2']
code = ['2001', '6969']
loggedIn = False
И вот в чем ошибка:
Traceback (most recent call last):
File "main.py", line 1, in <module>
import functions
ModuleNotFoundError: No module named 'functions'
ОБНОВЛЕНИЕ: Исправлено! Я думаю, что это был циклический импорт, который все испортил.
Комментарии:
1. Можете ли вы добавить полную ошибку, которую он выводит?
2. Я вставил точно ваш код в те же два файла на
repl.it
и получил приглашение для входа в систему. Тем не менее, то, что вы создали здесь, является циклическим импортом, поэтому остальная часть вашего кода фактически не будет работать.3. Вы убедились, что ваш functions.py файл находится в том же каталоге, что и ваш main.py файл?
4. Я не получаю вашу ошибку, и я получаю приглашение «Добро пожаловать в терминал. Пожалуйста, начните с ввода команды. »
Ответ №1:
В вашем коде есть несколько проблем, помимо циклического импорта; я взял на себя смелость немного его почистить.
- Вам нужно использовать
global
ключевое слово перед чтением глобальных переменных, если вы намереваетесь их изменить. Иногда вы можете обойтись без этого, но всегда лучше быть явным. Еще лучше было бы вообще не полагаться на глобальные переменные, инкапсулируя состояние внутри объекта, но это может быть упражнением в будущем. - Похоже, вы используете
==
то, что собираетесь назначить; для этого вам просто нужен один=
. - Вы можете просто бесконечно зацикливаться с
while
в вашей терминальной функции вместо рекурсивных вызовов взад и вперед междуterminal
иlogin/logout
— это просто приведет к потере вашего стека вызовов. - Ваши пользовательские коды — отличное место, чтобы узнать о том, как работают словари.
- Я добавил
exit
команду, а также предупреждение, если вы попытаетесь войти в систему, когда уже вошли в систему.
Здесь:
#main.py
import functions
def terminal() :
while True:
command = input('>> ')
if command == 'login' :
functions.login()
elif command == 'logout' :
functions.logout()
elif command == 'exit':
print("Goodbye!")
break
else:
print("Unknown command!")
print('Welcome to the terminal. Please start by entering a command.')
terminal()
И:
# functions.py
users_by_code = {
'2001': 'user1',
'6969': 'user2',
}
loggedIn = False
def login() :
global loggedIn
if loggedIn:
print('You are already logged in!')
return
while True:
enteredcode = input('Enter Passcode: ')
user = users_by_code.get(enteredcode)
if user:
break
print('Incorrect Code. Please Try Again.')
loggedIn = True
print('Login Successful!')
print('Logged in as:', user)
def logout():
global loggedIn
if loggedIn:
loggedIn = False
print('Logged Out.')
else:
print('You are already logged out.')
Ответ №2:
Вместо import functions
попробуйте from functions import *
Комментарии:
1. Это действительно не рекомендуемый метод. Помните, что «Явное лучше, чем неявное», и это может вызвать проблемы, которые сложно найти и отладить при столкновении имен.