Podsekcje

 
6.12 Instrukcja import

 

import_stmt  ::=  "import" module ["as" name] ( "," module ["as" name] )*
    | "from" module "import" identifier ["as" name]
      ( "," identifier ["as" name] )*
    | "from" module "import" "*"
module  ::=  (identifier ".")* identifier
Pobierz całą gramatykę w postaci tekstowej.

Instrukcje import wykonywane są w dwóch krokach: (1) odnalezienie modułu i, w razie konieczności, jego zainicjowanie, (2) definicja nazwy lub nazw w lokalnej przestrzeni nazw (zasięgu, w którym występuje instrukcja). W pierwszej postaci instrukcji (bez słowa kluczowego from) kroki te wykonywane są dla każdego identyfikatora z listy. Instrukcja w postaci ze słowem kluczowym from wykonuje krok (1) raz, a następnie powtarza wykonanie kroku (2).  

W przedstawionym kontekście "inicjowanie" modułu wbudowanego lub rozszerzenia oznacza wywołanie wywołanie udostępnianej przez moduł funkcji inicjującej (w implementacji wzorcowej wywoływana jest funkcja o nazwie uzyskanej poprzez dodanie przedrostka "init" przed nazwą modułu). "Inicjowanie" modułu napisanego w Pythonie oznacza wykonanie treści modułu.

Środowisko wykonawcze Pythona przechowuje tablicę modułów, które zostały już zainicjowane lub ich inicjowanie właśnie trwa, indeksując ją przy użyciu nazw modułów. Tablica dostępna jest pod nazwą sys.modules. Jeśli nazwa importowanego modułu zostanie odnaleziona w tej tablicy, kończy się wykonanie kroku (1). W przeciwnym wypadku rozpoczyna się poszukiwanie definicji modułu i, po jej pomyślnym odnalezieniu, załadowanie modułu. Szczegóły dotyczące procesu wyszukiwania i ładowania modułów są zależne od implementacji i platformy. Ogólnie przeszukuje się najpierw listę "wbudowanych" modułów, a następnie listę lokalizacji określoną przez wartość sys.path.   

Jeśli zostanie odnaleziony moduł wbudowany o podanej nazwie, wykonywany jest wbudowany kod inicjujący i kończy się wykonywanie kroku (1). Jeśli nie zostanie odnaleziony moduł wbudowany, ani też plik odpowiadający nazwie modułu, generowany jest wyjątek ImportError. Po odnalezieniu pliku następuje jego analiza składniowa, której wynikiem jest blok kodu wykonywalnego. W przypadku napotkania błędu składniowego generowany jest wyjątek SyntaxError . Po pomyślnej analizie składniowej tworzony jest pusty moduł o podanej nazwie, następnie wstawiany jest do tablicy modułów, a w końcu w jego kontekście wykonywany jest uzyskany wcześniej blok kodu. Wyjątki wygenerowane na tym etapie powodują przerwanie kroku (1).

Jeśli krok (1) zostanie zakończony bez wygenerowania wyjątku, może się rozpocząć wykonywanie kroku (2).

Pierwsza postać instrukcji import wiąże obiekt modułu z jego nazwą w lokalnej przestrzeni nazw, a następnie przechodzi do ewentualnych kolejnych identyfikatorów z listy. Jeśli po nazwie modułu pojawia się słowo kluczowe as, obiekt modułu wiązany jest z użyciem nazwy podanej po as.

Postać ze słowem kluczowym from nie wiąże nazwy modułu. Zamiast tego następuje przejście po liście identyfikatorów, wyszukanie każdego z nich w module odnalezionym w kroku (1), a następnie powiązanie odnalezionego obiektu pod podaną nazwą w lokalnej przestrzeni nazw. Podobnie, jak przy pierwszej postaci instrukcji, możliwe jest podanie alternatywnej lokalnej nazwy poprzez użycie zapisu "as nazwa_lokalna". Jeśli nazwa nie zostanie odnaleziona, generowany jest wyjątek ImportError. Jeśli lista identyfikatorów zostanie zastąpiona gwiazdką ("*"), w lokalnej przestrzeni nazw instrukcji import wiązane są wszystkie publiczne nazwy zdefiniowane w module.  

Nazwy publiczne definiowane przez moduł są określane poprzez odszukanie w przestrzeni nazw modułu nazwy __all__. Jeśli nazwa występuje, musi się odnosić do sekwencji napisów, które są nazwami zdefiniowanymi lub zaimportowanymi przez moduł. Wszystkie te nazwy są uznawane za publiczne i muszą istnieć po załadowaniu modułu. Jeśli nazwa __all__ nie jest zdefiniowana, zbiór nazw publicznych jest ustalany poprzez pobranie z przestrzeni nazw modułu wszystkich nazw, które nie rozpoczynają się znakiem podkreślenia ("_"). Sekwencja __all__ powinna zawierać całe publiczne API modułu. Służy ona zabezpieczeniu przed przypadkowym eksportem elementów, które nie są częścią API (np. modułów bibliotecznych importowanych przez moduł na jego wewnętrzny użytek).  

Postać instrukcji import ze słowem from i gwiazdką ("*") może się pojawić tylko w zasięgu modułu. Jeśli postać "import *" zostanie użyta wewnątrz funkcji, która zawiera zagnieżdżony blok z wolnymi zmiennymi, na etapie kompilacji zostanie zgłoszony błąd SyntaxError.

 

Hierarchiczne nazwy modułów: w przypadku, gdy nazwa modułu zawiera przynajmniej jedną kropkę, zmianie ulega zastosowanie ścieżki wyszukiwania. Sekwencja identyfikatorów aż do ostatniej kropki jest używana do odnalezienia "pakietu" , a końcowy identyfikator jest wyszukiwany wewnątrz pakietu. Pakiet jest zwykle podkatalogiem jednego z katalogów wymienionych na liście sys.path, który zawiera specjalny plik o nazwie __init__.py. 

Aplikacje, które określają listę ładowanych modułów w sposób dynamiczny, mogą do ich importowania wykorzystać wbudowaną funkcję __import__(). Aby uzyskać szczegółowe informacje na ten temat, zajrzyj do sekcji Wbudowane funkcje w pozycji Podręcznik programisty Pythona - opis biblioteki standardowej.  

 
6.12.1 Instrukcje future

Instrukcja future jest dyrektywą kompilatora, nakazującą skompilowanie danego modułu z użyciem składni lub semantyki, która będzie dostępna w określonej przyszłej wersji Pythona. Przeznaczeniem tej instrukcji jest ułatwienie migracji do przyszłych wersji Pythona, zawierających zmiany w języku, które wprowadzają pewne niezgodności. Pozwala ona na korzystanie z nowych elementów języka w wydzielonych modułach, zanim staną się częścią standardu.

future_statement  ::=  "from" "__future__" "import" feature ["as" name]
    ("," feature ["as" name])*
feature  ::=  identifier
name  ::=  identifier

Instrukcja future może się pojawić tylko na początku modułu. Jedynymi instrukcjami, jakie mogą wystąpić przed nią są:

Cechami rozpoznawanymi w Pythonie 2.3 są: "generators" (generatory), "division" (dzielenie) oraz "nested_scopes" (zagnieżdżone zasięgi). Wymienianie cech "generators" i "nested_scopes" jest w Pythonie 2.3 nadmiarowe, gdyż obie są domyślnie aktywne.

Instrukcja future jest rozpoznawana i traktowana w specjalny sposób na etapie kompilacji: Zmiany w semantyce rdzennych elementów języka są często realizowane poprzez generowanie innego kodu. Wprowadzenie nowej cechy może nawet pociągać za sobą nową składnię, niezgodną ze starszą (np. nowe słowo kluczowe), z czym może wiązać się konieczność odmiennej analizy składniowej przeprowadzanej przez kompilator. Odłożenie tego typu decyzji do etapu wykonania programu nie jest możliwe.

W przypadku każdego wydania Pythona kompilator zna nazwy zdefiniowanych cech i przy próbie wykonania instrukcji future z nieznaną cechą zgłasza błąd kompilacji.

Bezpośrednia semantyka wykonania instrukcji future jest taka sama, jak w przypadku każdej innej instrukcji import: istnieje standardowy moduł __future__ (opisany dalej), który jest w zwykły sposób importowany przy wykonaniu instrukcji future.

Interesująca nas semantyka jest uzależniona od użycia w instrukcji future konkretnej nazwy cechy.

Zauważmy, że w poniższej instrukcji nie ma nic specjalnego:

import __future__ [as nazwa]

Nie jest to instrukcja future, a zwykła instrukcja import bez specjalnego znaczenia czy ograniczeń składniowych.

Kod skompilowany przy użyciu instrukcji exec lub poprzez wywołania wbudowanych funkcji compile() i execfile(), które występują w module M, zawierającym instrukcję future, będzie domyślnie wykorzystywał nową składnię lub semantykę powiązaną z użytą instrukcją future. Poczynając od Pythona w wersji 2.2, zachowanie to może to być kontrolowane przez opcjonalne argumenty przekazane funkcji compile(). Aby poznać szczegóły, zajrzyj do dokumentacji tej funkcji w pozycji Podręcznik programisty Pythona - opis biblioteki standardowej.

Instrukcja future użyta w trybie interaktywnym wpływa na działanie interpretera aż do zakończenia jego sesji. Jeśli interpreter zostanie uruchomiony z opcją -i i nazwą pliku do wykonania jako parametrem, a w trakcie wykonywania pliku zostanie napotkana instrukcja future, to jej działanie będzie skutkowało również podczas interaktywnej sesji rozpoczętej automatycznie po wykonaniu pliku.

Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.