Pobieranie wyniku innej funkcji. ImportError

Odpowiedz Nowy wątek
2015-02-11 14:09
0

Witam.
Mam dwa pliki jeden.py i dwa.py w pliku jeden.py mamy taki kod:

from dwa import lol
def gettable():
    try:
        con = MySQLdb.connect('localhost', 'root', 'oskar', 'lager')
        con.autocommit(True)
    except MySQLdb.Error, e:
        print "Error %d: %s" % (e.args[0], e.args[1])
        sys.exit(1)
    cur = con.cursor()
    cur.execute("SHOW TABLES;")
    for (table_name) in cur:
        lol(table_name)

a w pliku dwa.py taki:

 from jeden import gettable
gettable()
def lol(nazwa):
    print(nazwa)

gdy to uruchomie dostaje komunikat: ImportError: cannot import name gettable. (zapętlony import?)
Jak mogę to rozwiązać by plik dwa.py dostal table_name. Próbowalem już z global, a jak się wkur.... to zrobie zapis do pliku i odczyt tego :).
Już nie mam pomysłu co robić

edytowany 1x, ostatnio: oskar_15, 2015-02-11 14:28

Pozostało 580 znaków

2015-02-11 14:22
0

Komunikat pokazuje ci wyraźnie gdzie masz błąd, przeczytaj go jeszcze raz:
cannot import name gettable

Pokaż plik mag.py, bo tam masz błąd (albo importujesz nie to co trzeba).

Pozostało 580 znaków

2015-02-11 14:29
0

plik mag.py to jest jeden.py :) (poprawione) a plik już pokazałem.

Pozostało 580 znaków

2015-02-11 15:58
0

Moduł dwa wywołuje metodę gettable z modułu jeden, która potrzebuje z kolei metody lol z modułu dwa, ale ta nie jest jeszcze zdefiniowana (zauważ, że wywołanie gettable() jest nad deklaracją metody lol). Trochę to skomplikowane i jeśli nie rozumiesz, to się nie martw - po prostu tego nie rób. Wpadłeś w pułapkę circular dependency, czyli dwa moduły zależą od siebie nawzajem. Jest to wynik złego rozplanowania modułów. Jeśli każdy moduł będzie miał określone zadanie to nie powinno się zdarzyć. Masz dwie możliwości, pierwsza - najprostsza - to wsadzić wszystko do jednego modułu, skoro są one dosyć małe.

Druga to przesunąć metodę lol na górę, nad import. Czyli w pliku dwa.py:

def lol(nazwa):
    print(nazwa)

from jeden import gettable
gettable()

Teraz jak wywoływana jest metoda gettable(), to metoda lol znajduje się już w pamięci (jest wczytana).

Edit: Tutaj więcej dowiesz się jak działają importy: http://stackoverflow.com/ques[...]r-or-cyclic-imports-in-python

edytowany 1x, ostatnio: Wizzie, 2015-02-11 16:00

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0