Zanurkuj w Pythonie/Dwa sposoby importowania modułów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
zamiana ProstaNawigacja->Subst:ProstaNawigacja
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Linia 1:
== Importowanie modułów za pomocą <ttcode>from module import</ttcode> ==
{{Podświetl|py}}
== Importowanie modułów za pomocą <tt>from module import</tt> ==
 
W Pythonie mamy dwa sposoby importowania modułów. Obydwa są przydatne, dlatego też powinniśmy umieć je wykorzystywać. Jednym ze sposobów jest użycie polecenia <ttcode>import nazwa_modulu</ttcode>, który mogliśmy zobaczyć w rozdziale [[Python../Twój pierwszy program#Wszystko jest obiektem|TwójPodrozdziale pierwszy2.4, program - „Wszystko"Wszystko jest obiektem”obiektem"]]. InnyIstnieje inny sposób, który realizuje tę samą czynność, ale posiada pewne różnice. NiżejPoniżej jestzostał prostyprzedstawiony przykład wykorzystujący instrukcję <ttcode>from module import</ttcode>:
 
from UserDict import UserDict
 
Jak widzimy, jestskładnia totego wwyrażenia składnijest bardzo podobnepodobna do <ttcode>import nazwa_modulu</ttcode>, ale z jedną ważną różnicą: atrybuty i metody importowanegodanego modułu są importowane bezpośrednio do lokalnej przestrzeni nazw, tak więc będą dostępne bezpośrednio, bezi dodawanianie kwalifikatoramusimy określać, z jakiegoktórego modułu korzystamy. Możemy importować określone pozycje lubalbo użyćskorzystać z <ttcode>from module import *</ttcode>, aby zaimportować wszystko.
 
{{Infobox|1=<ttcode>from module import *</ttcode> w Pythonie jest podobne doprzypomina <ttcode class="lang-pl">use module</ttcode> w Perlu;, a Pythonowe <ttcode>import module</ttcode> wprzypomina Pythonie przypominaPerlowskie <ttcode>require module</ttcode> w Perlu.}}
}}
{{Infobox|<ttcode>from module import *</ttcode> w Pythonie jest analogią do <ttcode>import module.*</ttcode> w Javie;, a <ttcode>import module </ttcode> w Pythonie przypomina <ttcode>import module</ttcode> w Javie.}}
 
'''Przykład 5.2. <tt>import module</tt> a <tt>from module import</tt> '''
 
{{Python/Przykład
'''Przykład |5.2.|Różnice między <ttcode>import module</ttcode> a <ttcode>from module import</ttcode> '''
|tekst=
>>> import types
>>> types.FunctionType #(1)
{{samp|<type 'function'>}}
>>> FunctionType #(2)
{{sampErr|Traceback (innermost last):
File "<interactive input>", line 1, in ?
NameError: There is no variable named 'FunctionType'}}
>>> from types import FunctionType #(3)
>>> FunctionType #(4)
{{samp|<type 'function'>}}
 
# Moduł <ttcode>types</ttcode> nie posiada żadnych metod;. posiadaPosiada on jedynie atrybuty dlaokreślające każdegowszystkie typutypy obiektuzdefiniowane wprzez PythoniePythona. Zauważmy, że atrybut (w tym przypadku <code>FunctionType</code>) musi być poprzedzony nazwą modułu -- <ttcode>types</ttcode>.
# <code.FunctionType</code> nie został sam w sobie określony w przestrzeni nazw; istnieje on tylko w kontekście modułu <ttcode>types</ttcode>.
# UżywającZa tejpomocą składnitego wyrażenia atrybut <code>FunctionType</code> z modułu <ttcode>types</ttcode> został zaimportowany bezpośrednio do lokalnej przestrzeni nazw.
# Teraz możemy odwoływać się bezpośrednio do <code>FunctionType</code>, bez odwoływania się do <ttcode>types</ttcode>.
}}
 
Kiedy powinniśmy używać <ttcode>from module import</ttcode>?
* Kiedy często odwołujemy się do atrybutów i metod, ia nie chcemy wielokrotnie wpisywać nazwy modułu., Wtedywtedy najlepiej wykorzystać <ttcode>from module import</ttcode>.
* Jeśli potrzebujemy selektywnie zaimportować tylko kilka atrybutów, lub metod, powinniśmy wykorzystaćskorzystać z <ttcode>from module import</ttcode>.
* Jeśli moduł zawiera atrybuty lub metody, które posiadają taką samą nazwę jaka jest w naszym module, powinniśmy wykorzystać <ttcode>import nazwa_modulu</ttcode> aby uniknąć konfliktu nazw.
 
W innychpozostałych przypadkach jest to kwestia stylu programowania, można spotkać kod napisany obydwoma sposobami.
* Kiedy często odwołujemy się do atrybutów i metod i nie chcemy wielokrotnie wpisywać nazwy modułu. Wtedy najlepiej wykorzystać <tt>from module import</tt>.
* Jeśli potrzebujemy selektywnie zaimportować tylko kilka atrybutów, metod, powinniśmy wykorzystać <tt>from module import</tt>.
* Jeśli moduł zawiera atrybuty lub metody, które posiadają taką samą nazwę jaka jest w naszym module, powinniśmy wykorzystać <tt>import nazwa_modulu</tt> aby uniknąć konfliktu nazw.
W innych przypadkach jest to kwestia stylu, można spotkać kod napisany obydwoma sposobami.
 
{{Infobox|Należy używaćUżywajmy <ttcode>from module import *</ttcode> oszczędnie, ponieważ taki sposób importowania utrudnia on określenie, skąd pochodzi dana funkcja lub atrybut, dlategoa teżto z kolei utrudnia debugowanie (wyszukiwanie błędów w programie).}}
}}
 
=== Materiały dodatkowe ===
* [http://www.effbot.org/zone/ eff-bot] opowie nam więcej na temat [http://www.effbot.org/zone/import-confusion.htm różnic między <code>import module</code> a <code>from module import</code>].
* [http://www.python.org/doc/current/tut/tut.html Python Tutorial] omawia zaawansowane techniki importu, włączając w to [http://www.python.org/doc/current/tut/node8.html#SECTION008410000000000000000 <code>from module import *</code>].
<noinclude>
{{Nawigacja|Python|
[[Python../Obiekty i klasy|Obiekty i klasy/]]|
[[Python../Definiowanie klas|Definiowanie klas/]]|
}}
{{Podświetl|py}}
</noinclude>