2017-01-17 4 views
0

Hallo Ich habe Probleme mit dem Importieren von Funktionen in meinen Modulen. Ich bekomme Fehler:Import Funktionen von Modulen zurück und Fort

NameError: name 'main_menu' is not defined 

Ich habe 6 Module (Haupt, Menü, Benutzer, Bücher, Autos, etc.)

In meinem main.py I from menu import *

In meinem Menü haben Py ich habe:

from users import * 
from books import * 

Und jetzt, wenn ich versuche Funktion zu importieren main_menu() von menu.py zu meinem users.py Ich bekomme diesen Fehler.

Ich erinnerte mich, dass ich irgendwie Funktionen von Modulen nicht hin und her importieren kann. Aber wie kann ich anrufen main_menu() Funktion, die sich in menu.py befindet als?

Meine Frage ist wirklich, wie kann ich eine Funktion von einem anderen Modul importieren und aufrufen, wenn ich bereits alles aus meinem aktuellen Modul importiert habe?

EDIT:

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

ERROR:

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

Der von Ihnen angegebene Fehler stimmt nicht mit den von Ihnen angegebenen Funktionsnamen überein. Bitte editiere und stelle ein [mcve] und einen Fehler bereit. – Julien

+0

@JulienBernu ist es jetzt in Ordnung? – FrankieD

+0

Anstatt zu sagen, dass ich das tue, dann mache ich das, bitte teilen Sie den Inhalt aller relevanten Skripte. Mit den wenigen Informationen, die Sie teilen, ist es schwer zu sagen, ob Sie nur einen Import vergessen oder ob dieser (vielleicht) fehlende Import einen Zirkelverweis erzeugt ... – Julien

Antwort

0

Sie haben einen kreisförmigen Import zwischen den menu und users Modulen. Da Sie from module import * Syntax verwenden, funktioniert es nicht wie Sie beabsichtigen. Eines der Module ist leer, wenn Sie versuchen, alle Namen daraus zu importieren (da es darauf wartet, dass das andere geladen wird). Welches Modul genau ausfällt, hängt davon ab, wie externer Code diese Module zuerst lädt.

Eine einfache Lösung wäre, nur die grundlegende import module Syntax anstelle von from module import * Syntax verwenden (Wildcard-Importe sind oft eine schlechte Idee sowieso, aus Gründen der Namespace Verschmutzung).

So könnten Sie versuchen:

menu.py:

import users 

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

Benutzer.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() 

Viele Leute werden Ihnen sagen, dass die zirkuläre Importe ein deutliches Zeichen für schlechtes Design sind, und dass Sie sollten immer los werden. Ich tendiere dazu, nicht so hart auf sie zu kommen, da sie in Python gut funktionieren können, wenn du sie richtig machst.

In diesem Fall kann es jedoch sinnvoll sein, einige Ihrer Module einfach miteinander zu kombinieren. Wenn Sie keine Namespace-Trennung benötigen (was Sie eindeutig nicht getan haben, da Sie Platzhalterimporte verwendet haben), können Sie auch alles in dieselbe Datei schreiben. Dann haben Sie keine Probleme mit zirkulären Importen, da Sie überhaupt keine Importe haben werden.

+0

Danke, ich werde versuchen, etwas aus Ihrer Antwort zu kombinieren! – FrankieD

Verwandte Themen