2011-11-17 5 views
6

Mam pytanie, które wydaje się dość podstawowe, ale nie mogę znaleźć żadnej pomocy w tej sprawie.Python importuje moduły i zmienne globalne

file_a.py >> 

from xyz import XYZ 
class A: 
    . 
    . 
    . 

file_b.py >> 

import file_a 
from file_a import A 
class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def someMethod(self): 
     XYZ.doSomething() 

XYZ.doSomething() nie mówiąc NameError: nazwa 'XYZ' nie jest zdefiniowane Nawet standardowe importu jak 'import sys' done z file_a nie wydaje się, aby była ona użyteczna w file_b. Zakładałem, że to powinno zadziałać. Czy moje zrozumienie jest złe? Jeśli tak, to czy istnieje sposób na wspólne importowanie i globalne zmienne w plikach? (Jeśli nie jest to pomocne, jestem programistą C++ i java i teraz zaczynam używać pythona.)

Odpowiedz

5

Is my understanding wrong?

Tak, ponieważ import linia from file_a import A tylko klasa A do przestrzeni nazw file_b. Przestrzeń nazw file_a jest pozostawiona sama. Gdyby nie to podoba, nie byłoby sensu posiadaniem zarówno składni:

import modulename 
from modulename import something 

jakby twoje myślenie było w porządku, a po drugiej postaci byś zawsze móc korzystać modulename.someotherthing.

If yes, then is there a way to have common imports and global variables across files?

Tak, z gwiazdą * operatora:

from modulename import * 

ale to przynosi kwestię zanieczyszczenia przestrzeni nazw, na przykład from file_a import * będzie importować w file_b także wszystkie importu wykonywane w file_a. You będzie ostatecznie stracić kontrolę nad importem i to cię ugryzie w pewnym momencie ... zaufaj mi w tej sprawie!

Kiedy potrzebna jest dla niektórych powodem from module import *, obejście tego problemu zanieczyszczenia przestrzeni nazw jest określenie w module na variable __all__, który Whitelists co powinno być importowane z operatorem gwiazdy.

HTH!

4

Podczas importowania modułu wszystkie zmienne zdefiniowane w tym module są dostępne w jego przestrzeni nazw. W związku z tym, jeśli XYZ jest dostępny w module file_a, po import file_a możesz uzyskać dostęp do XYZ jako file_a.XYZ.

Ogólna koncepcja polega na tym, że przestrzeń nazw nie powinna być zagracona zawartością innych przestrzeni nazw.

1
import file_a 
from file_a import A 

Myślę, że problemem jest: nie importuj XYZ naprawdę!

from fila_a import * 

może rozwiązać problem, ale nie jest to dobry sposób, ~~~

można napisać to w file_b:

from file_a import XYZ 

To jest zrobione?

3

Tak, twoje zrozumienie jest złe. Każdy moduł jest własną przestrzenią nazw i tylko rzeczy, które jawnie zaimportujesz w tym pliku, są dostępne w tym obszarze nazw.

W przeciwieństwie do innych odpowiedzi, nie jest szczególnie Pythoniczne odwoływanie się do file_a.XYZ, chociaż to zadziała. Zamiast tego należy zaimportować XYZ i sys u góry file_b.

+0

Cóż, to jest moje pytanie. Chcę uniknąć powtarzania zestawu importów w wielu plikach, takich jak file_b. Wiem, że importowanie XYZ i sys do file_b działa. – ksrini

+1

@ksrini Nie powinieneś tego chcieć. Dobrze jest jawnie importować wszystko, czego używa moduł. Czyści listę wszystkich zależności w jednym miejscu. Zobacz PEP20 - jawność jest lepsza niż niejawna. – yak

+0

Dziękuję jaka, to było interesujące i wnikliwe! – ksrini