2014-12-17 12 views

Odpowiedz

9

Podczas importowania * z przyszłego modułu jest prawdopodobnie niebezpieczny i należy go unikać z powodów, o których wspomina John Zwinck, interesujące było dowiedzieć się, dlaczego to nie działa. Działa to inaczej niż zwykła składnia importu w języku Python, która pozwala pobrać wszystko z modułu przy użyciu *.

Można zobaczyć, co dzieje się poprzez otwarcie Lib/compiler/future.py w Pythonie katalogu instalacyjnego: wszystkie instrukcje importu, które importują z __future__ są prowadzone przez specjalny parser, który pozwala jedynie, aby spróbować i importować jedną z predefiniowanych funkcji. Z kodu źródłowego FutureParser:

features = ("nested_scopes", "generators", "division", 
      "absolute_import", "with_statement", "print_function", 
      "unicode_literals") 

Więc w zasadzie masz rację zauważyć, że import z __future__ jest szczególnym przypadkiem, który działa nieco odmiennie od zwykłego procesu importowania Pythona, ale istnieją dobre powody.

7

Importowanie "wszystkiego" z przyszłości nie jest ani pożądane, ani sensowne. W rzeczywistości przez większość czasu nie powinno się importować w ogóle numeru *, ale w przypadku __future__ jest to szczególnie podstępne: jakie funkcje zamierzasz uzyskać? Byłoby bardzo trudno napisać poprawny program, który będzie działał z przyszłymi wersjami Pythona, których funkcje nie są jeszcze znane.

+0

Oczywiście, jest to zły pomysł, ale ta odpowiedź nie wyjaśnia, dlaczego ten błąd występuje ... – senshin

Powiązane problemy