*** Strona 137 *******************************************************************

# naley umieci ten kod w pliku moduowym nazwanym
# "module1.py", w katalogu podanym w PYTHONPATH (lub w katalogu biecym)

def printer(x):     # atrybut moduu
    print x


# nastpnie naley zaimportowa go w trybie interakcyjnym

% python
>>> import module1                   # pobieranie moduu
>>> module1.printer('Hello world!')  # kwalifikowanie nazw (modu.nazwa)
Hello world!

>>> from module1 import printer      # pobranie eksportu
>>> printer('Hello world!')          # kwalifikacja nazwy nie jest potrzebna
Hello world!

>>> from module1 import *            # pobranie caoci eksportu
>>> printer('Hello world!')
Hello world!


*** Strona 138-139 ***************************************************************

# naley umieci ten kod w pliku moduowym nazwanym "module2.py"

print 'start ladowania...'

import sys
nazwa = 42

def func(): pass

class klass: pass

print 'ladowanie zakonczone.'


# teraz, mona go uy w trybie interakcyjnym

>>> import module2
start ladowania...
ladowanie zakonczone.

>>> module2.sys
<module 'sys'>
>>> module2.nazwa
42
>>> module2.func, module2.klass
(<function func at 765f20>, <class klass at 76df60>)

>>> module2.__dict__.keys()
['__file__', 'nazwa', '__name__', 'sys', '__doc__', '__builtins__', 'klass', 'func']


*** Strona 141 ******************************************************************

% cat prosta.py
print 'hello'
mielonka = 1                 # zapocztkowanie zmiennej

% python
>>> import prosta            # pierwszy import: aduje i uruchamia kod pliku
hello
>>> prosta.mielonka          # przypisanie tworzy atrybut
1
>>> prosta.mielonka = 2      # zmiana atrybutu w module
>>>
>>> import prosta            # po prostu pobiera ju zaadowany modu
>>> prosta.mielonka          # kod nie zosta uruchomiony, atrybut bez zmian
2


*** Strona 141-142 ***************************************************************

% cat maluch.py
x = 1
y = [1, 2]

% python
>>> from maluch import x, y    # tworzy kopie dwch nazw
>>> x = 42                     # zmienia tylko lokalne x
>>> y[0] = 42                  # modyfikuje wspdzielony obiekt zmienny 
>>>
>>> import maluch              # pobiera nazw moduu (from tego nie robi)
>>> maluch.x                   # x z obiektu maluch jest obcym x
1
>>> maluch.y                   # wspdzielony i zmieniony obiekt zmienny
[42, 2]


# emulacja "from"

import module                  # pobiera obiekt moduowy
nazwa1 = module.nazwa1         # kopiuje nazwy za pomoc przypisania
nazwa2 = module.nazwa2 
...
del module                     # pozbywamy si nazwy moduu


*** Strona 144 *******************************************************************

% cat zmieniacz.py
komunikat = "Pierwsza wersja"

def drukuj():
    print komunikat

% python
>>> import zmieniacz
>>> zmieniacz.drukuj()
Pierwsza wersja
>>>

# teraz zmieniamy "changer.py"...

% vi zmieniacz.py
% cat zmieniacz.py
komunikat = "Po modyfikacji"

def drukuj():
    print 'odnowiono:', komunikat

# z powrotem do interpretera...

>>> import zmieniacz
>>> zmieniacz.drukuj()   # brak efektu, uywa moduu ju zaadowanego
Pierwsza wersja

>>> reload(zmieniacz)    # wymuszone zaadowanie i uruchomienie nowego kodu
<module 'zmieniacz'>
>>> zmieniacz.drukuj()   # teraz uruchamiana jest nowa wersja
odnowiono: Po modyfikacji


*** Strona 147-148 ***************************************************************

# naley umieci ten kod w pliku runme.py

def tester():
    print "W niebiosach jest Boze Narodzenie..."

if __name__ == '__main__':                       # tylko gdy uruchamiany
    tester()                                     # a podczas importu

% python
>>> import runme
>>> runme.tester()
W niebiosach jest Boze Narodzenie...

% python runme.py
W niebiosach jest Boze Narodzenie...


>>> import sys
>>> sys.path
['.', 'c:\\python\\lib', 'c:\\python\\lib\\lib\\tkinter']

>>> sys.path = ['.']                      # zmiana cieki szukania moduw
>>> sys.path.append('c:\\book\\examples') # lewe ukoniki jako "\\"
>>> sys.path
['.', 'c:\\book\\examples']

>>> import string
Traceback (innermost last):
  File "<stdin>", line 1, in ?
ImportError: No module named string


*** Strona 150-151 ***************************************************************

# modu, ktry podaje zawarto przestrzeni nazw innych moduw

gadanie = 1

def listing(modul):
    if gadanie:
        print "-"*30
        print "nazwa:", modul.__name__, "plik:", modul.__file__
        print "-"*30

    licz = 0
    for atr in modul.__dict__.keys():      # skanowanie przestrzeni nazw
        print "%02d) %s" % (licz, atr),
        if atr[0:2] == "__":
            print "<nazwa wbudowana>"      # pominicie __file__ itd.
        else:
            print getattr(modul, atr)      # to samo co __dict__[atr]
        licz = licz+1

    if gadanie:
        print "-"*30
        print modul.__name__, "ma %d nazw" % licz
        print "-"*30

if __name__ == "__main__":
    import mydir
    listing(mydir)                         # kod samotestujcy: spis wasny


C:\python> python mydir.py
-------------------------------
nazwa: mydir plik: mydir.py
-------------------------------
00) __file__ <nazwa wbudowana>
01) __name__ <nazwa wbudowana>
02) listing <function listing at 885450>
03) __doc__ <nazwa wbudowana>
04) __builtins__<nazwa wbudowana>
05) gadanie 1
---------------------------------
mydir ma 6 nazw
---------------------------------


*** Strona 152 *******************************************************************

>>> modname = "lancuch"
>>> exec "import " + modname    # uruchamianie acucha bdcego kodem
>>> lancuch                     # import w tej przestrzeni nazw
<module 'lancuch'>

>>> modname = "lancuch"
>>> lancuch = __import__(modname)
>>> lancuch
<module 'lancuch'>


*** Strona 152-153 ***************************************************************

# modu nested1.py

X = 99
def printer(): print X


# modu nested2.py

from nested1 import X, printer    # kopiuje nazwy
X = 88                            # zmienia tylko nasze "X"!
printer()                         # X z nested1 wynosi wci 99

% python nested2.py
99


# modu nested3.py

import nested1          # pobranie moduu jako caoci
nested1.X = 88          # w porzdku: zmiana X z nested1
nested1.printer()

% python nested3.py
88


*** Strona 153 *******************************************************************

func1()               # bd: "func1" nie jest jeszcze przypisana

def func1():
    print func2()     # w porzdku: "func2" bdzie wyszukana pniej

func1()               # bd: "func2" nie jest jeszcze przypisana

def func2()
    return "Hello"

func1()               # w porzdku: "func1" i "func2" s przypisane


*** Strona 154 *******************************************************************

# modu recur1.py

X = 1
import recur2                      # uruchamienie recur2, jeli nie istnieje
Y = 2

# modu recur2.py

from recur1 import X               # w porzdku: "X" ju jest przypisane
from recur1 import Y               # bd: "Y" nie jest jeszcze przypisane

>>> import recur1
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "recur1.py", line 2, in ?
    import recur2
  File "recur2.py", line 2, in ?
    from recur1 import Y           # bd: "Y" nie jest jeszcze przypisane
ImportError: cannot import name Y


*** Strona 155-156 ***************************************************************

from module import X     # X moe nie odczuwa ponownego adowania moduu!
. . .
reload(module)           # zmienia modu, ale nie nazwy
X                        # nadal dziaa na starym obiekcie

# kontra

import module            # pobranie moduu, a nie nazw
. . .
reload(module)           # modyfikacja moduu w miejscu
module.X                 # pobranie aktualnego X: wida ponowne zaadowanie


% cat A.py
import B                 # nie jest adowany ponownie, gdy adowany jest A 
import C                 # po prostu import ju zaadowanego moduu

% python
>>> . . . 
>>> reload(A)


***kod do wicze znajduje si w katalogu "rozwiazania"***