Instruilo por la programlingvo Pitono

Bonvolu sendi korektojn, proponojn, kaj sugestojn al vilcxjo ĉe esperanto-me.org

Moduloj

La Modula Serĉvojo

Kompilitaj Pitonaj dosieroj

Pramoduloj

La funkcio dir()

Pakaĵoj (por spertuloj)

 

Moduloj

Se vi ĉesu la Pitonan interpretilon kaj rekomenci ĝin, la difinoj kiun vi faris (funkcioj kaj variabloj) estas perditaj. Tial, se vi volas skribi iom longan programon, estas pli facila uzi redaktilon por pretigi tekston (skripton) por la interpretilo.

Kiam via programo iĝas granda, vi eble volas dividi ĝin en kelkajn dosierojn, por pli facila revizio. Vi ankaŭ eble volas uzi utilan funkcion, kiu vi skribis antaŭe, en kelkaj programoj, sed vi ne volas kopii ĝin en ĉiun programon.

Piton helpos vin pri tio. Vi povas enmeti difinojn en dosieron kaj uzu ilin en skripto a^u interaktive je la interpretilo. Tia dosiero estas nomita modulo; vi povas importi difinojn de modulo en aliajn modulojn aŭ en la modulon __main__ (la plej altnivela skripto, aŭ interaktive, la pli alta nivelo).

Modulo estas dosiero kiu enhavas Pitonajn difinojn kaj instrukcioj. La nomo de la dosiero estas la modjula nomo kun la sufikso '.py'. En modulo, la propra nomo de la modulo estas havebla - estas la valoro de la malloka variablo __name__.

Por ekzemplo, uzu vian preferatan redaktilon por krei dosieron nomita 'fibo.py' en la aktuala dosierujo liu havas la jenajn enhavojn:

>>># Fibonacci-a serio modulo
...def fib(n):   #skribu Fibonacci-an serion ĝis n
... a, b = 0, 1
... while b < n:
... print b,
...     a, b = b, a+b
...

>>>def fib2(n):
# resendi Fibonacci-an serion ĝis n
... rezulto = []
...    a, b = 0, 1
...    while b < n:
...        rezulto.append(b)
...        a, b = b, a+b
...   return rezulto
...

Nun, eniru la Pitonan interpretilon kaj importi ĉi tiun modulon per la jena komando:

   >>> import fibo

Ĉi tiu ne eniras la nomojn de la funkcioj el fibo rekte en la aktualan simboltabelon. Ĝi eniras tie nur la modjulan nomon. Per uzo de la modjula nomo, vi povas atingi la funkciojn:

   >>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Se vi intencas uzi funkcion ofte, vi povas asigni ĝin al loka nomo:

   >>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Modulo povas enhavi instrukciojn, krom funkciajn difinojn. La celo de ĉi tiuj instrukcioj estas pretigi la modulon. Pitono plenumas ilin nur kiam la modulo estas unufoje importita.

Ĉiu modulo havas sian propran simboltabelon, kiu estas la malloka simboltabelo por ĉiuj funkcioj en la modulo. Do, la aŭtoro de modulo povas uzi la mallokajn variablojn en la modulo sen zorgi pri hazardaj konfliktoj kun la mallokaj variabloj de aliaj moduloj. Aliaflanke, se vi volas, vi povas tuŝi la mallokajn variablojn de modulo same kiel ĝiajn funkciojn - modnomo.varnomo.

Moduloj povas importi aliajn moduloj. Estas kutima, sed ne necesa, ke vi metas ĉiujn instrukciojn import ĉe la komenco de modulo aŭ skripto. La nomoj de la moduloj importitaj iros en la simboltabelon de la modulo importanta.

Varianto de la instrukcio import importas funkciajn nomojn el modulo rekte en la simboltabelon de la importanta modulo. Por ekzemplo:

   >>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 4 8 13 21 34 55 89 144 233 377

Ĉi tiu ne enkondukas la nomon de la importita modulo en la lokan simboltabelon. (do fibo ne estas difinita, en la supra ekzemplo).

Varianto importas ĉiujn nomojn difinitan en modulo:

   >>> from fibo import *              
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Ĉi tiu importas ĉiujn nomojn krom tiuj kiuj komencas per substreko (_). Ĉi tiu varianto estas evitinda, ĉar du aŭ pli importitaj moduloj eble havas difinojn samnomitajn. Nur la difino laste importita restis.

La Modula Serĉvojo

Kiam modulo nomita 'spam' estas importita, la interpretilo serĉas dosieron nomita 'spam.py' en la aktuala dosierujo, kaj poste en la listo de dosierujoj en la mediovariablo 'PYTHONPATH. Se PYTHONPATH ne ekzistas, aŭ la dosiero ne estas trovita, implicita vojo (dependas de la sistemo) estas serĉita.

(Fakte, Pitono serĉas la liston de dosierujoj provizitaj de la variablo sys.path. Ĉi tiu variablo estas sekvenco de dosierujaj nomoj, elĉerpita el la vojoj supre.

Estas grave, ke moduloj ne havas la samajn nomojn kiel pramoduloj, aŭ Pitono provas uzi la skripton anstataŭ la pramodulon.

Kompilitaj Pitonaj dosieroj

Por rapidigi la ektempon de mallongaj programoj, kiuj uzas multon da pramoduloj, Pitono ĉiam provas trovi kompilitan kodon ('spam.pyc') antaŭ ĝi serĉas skripton ('spam.py'). La dosiero 'spam.pyc' enhavas la tempon de la lasta ŝanĝo al 'spam.py' - se la du tempoj ne egalas, Pitono ignoras la dosieron '.pyc'.

Kutime, vi ne devas fari iu ajn por krei la 'spam.pyc' dosieron. Kiam 'spam.py' estas kompilita, Pitono provas skribi la 'spam.pyc' dosieron. Se Pitono malsukcesas, eraro ne okazas, sed la 'spam.pyc' dosiero estas nevalida. La enhavoj de la '.pyc' dosiero estas sendependa de komputila medio.

Programo ne fukcias pli rapide pro uzo de .pyc dosieroj. Nur la ŝargo de la programo estas pli rapida. (Spertuloj notu: la modulo compilall kreas .pyc-an dosierojn por ĉiuj moduloj.)

Pramoduloj

Pitono havas bibliotekon de pramoduloj, priskribitaj en aparta dokumento, la Python Library Reference

Iom da moduloj estas pramoduloj en la interpretilo; ĉi tiuj donas atingorajton al operacioj ke ne estas parto de la kerno de la lingvo, sed tamen estas esencaj, aŭ por efikeco aŭ por provizi atingon al primitivoj de la operaciumo, ekzemple vokoj al la sistemo mem. Malsamaj moduloj povas esti inkludita en malsamaj versioj de Pitono, dependante de komputila medio; ekz., la 'amoeba' modulo estas inkludita nur se la medio iel subtenas Amoeban primitivoj.

Specifa modulo meritas atenton: sys, kiu estas pramodulo en ĉiu Pitona interpretilo. La variabloj sys.ps1 kaj sys.ps2 difinas la ĉenojn uzitajn kiel la ununivela kaj dunivela invitoj:

   >>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print 'Yuck!'
Yuck!
C>

Ĉi tiuj du variabloj estas difinita nur se la interpretilo estas en interaga reĝimo.

Vi povas ŝanĝi variablon sys.path per kutimaj listaj agadoj. Per tio, vi povas aldoni dosierujon al la serĉvojo. Ekz:

>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')

La funkcio dir()

La prafunkcio dir() eltrovas la nomojn difinitajn de modulo. Ĝi resendas ordigitan liston de ĉenoj:

   >>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__',
'__stderr__', '__stdin__', '__stdout__', '_getframe',
'api_version', 'argv', 'builtin_module_names',
'k.t.p.']

Sen argumentoj , la funkcio dir() listas nomojn kiujn vi aktuale difinis:

   >>> a = [1, 2, 3, 4, 5]
>>> import fibo, sys
>>> fib = fibo.fib
>>> dir()
['__name__', 'a', 'fib', 'fibo', 'sys']

Notu ke la funkcio dir() listas ĉiujn tipojn da nomoj: variabloj, moduloj, funkcioj, k.t.p.

La funkcio dir() ne listas la nomojn de prafunkcioj kaj primativaj variabloj. Se vi volas tian liston, ili estas difinitaj en modulo __builtin__:

   >>> import __builtin__
>>> dir(__builtin__)
['AccessError', 'AttributeError', ConflictError',
'EOFError', 'IOError','ImportError', IndexError',
k.t.p]

Pakaĵoj

Pakaĵo estas metodo trakti aron de moduloj kiel unu aĵon. Vi povas indiki erojn en la pakaĵo per la uzo de nomoj kiuj enhavas punktojn. Ekzemple, la modula nomo A.B indikas sub-modulon nomita B en pakaĵo nomita A.

Ni supozu, ke vi volas designi aron da moduloj ("pakaĵo") por la unuforma traktado de son-dosieroj kaj son-datumoj. Ekzistas multajn formatoj de son-dosieroj (kutime rekonitaj per siaj sufiksoj, ekz: .wav, .aiff, .au), do vie eble devas krei kaj varti kreskantan aron de moduloj por la konverto inter la diversaj dosier-formatoj. Plue, estas multaj malsamaj operacoj vi eble volos efektivigi je son-datumoj (ekz: miksado, aldono de eĥo, kreo de stereofonia efiko), do vi ankaŭ skribos senlliman kvanton de moduloj por efektivigi ĉi tiujn operaciojn. Jen eble strukturo por via pakaĵo (esprimita per hierarkia dosiersistemo):

Sono/
                   Altnivela
pakaĵo
__init__.py    Komencvalorizi la pakaĵon
    Formatoj/      Subpackaĵo por konverti dosier-formatojn
        __init__.py
wavlegi.py
wavskribi.py aiflegi.py
aifskribi.py
aulegi.py auskribi.py
...
   Efekoj/ Subpackaĵo por son- efekoj
__init__.py
ehxo.py
ĉirkaŭ.py reversi.py
...
Filtroj/      Subpackaĵo por filtroj
__init__.py
egalilo.py
vocoder.py
karaoko.py
...

Dum importo de la pakaĵo, Pitono traserĉas la dosierujojn en sys.path por trovi la subdosierujo(j)n de la pakaĵo.

La dosieroj __init__.py estas bezonitaj por ke Pitono traktos la dosierujoj kiel pakaĵujoj. Tio esta farita por ke dosierujoj kun oftaj nomoj (ekz: "ĉeno") ne akcidente kaŝos samnomajn modulojn kiuj estas indikitaj poste en la sercvojo. En la plej simpa kazo, __init__.py povas esti malplena dosiero, sed ĝi ankaŭ povas plenumi komencvalorizan kodon por la pakaĵo aŭ valorizi la variablon __all__ , priskribitan poste.

Uzanto de la pakaĵo povas importi individuan modulon el la pakaĵo, ekz:

import Sono.Efekoj.eĥxo

Ĉi tiu ŝargis la submodulon Sono.Efekoj.eĥo. Oni devas referenci ĝin per la tuta nomo.

Sono.Efekoj.eo.eĥofiltro(enigo, eligo, atendo=0.7, aten=4)             

Alternativa metodo por importi la submodulon estas:

from Sono.Efekoj import eĥo

Ĉi tiu ankaŭ ŝargas la submodulon eĥo, kaj havebligas ĝin sen ĝia pakaĵa prefikso, por ke oni povas uzi ĝin jene:

eĥo.eĥofiltro(enigo, eligo, atendo=0.7, aten=4)

Alia metodo estas rekte importi la funkcion deziritan.

from Sono.Efekoj.eĥo import eĥofiltro            

Refoje, ĉi tiu ŝargas la submodulon eĥo, sed la funkcio eĥofiltro() estas rekte havebla:

eĥo.eĥofiltro(enigo, eligo, atendo=0.7,aten=4)            

Rimarku, ke kiam vi uzas metodon

from
packaĵo import ero

la ero povas esti submodulo, aŭ alia nomo difinita en la pakaĵo, nome funkcio, klaso, aŭ variablo. La instrukcio import unue testas, ĉu la ero estas difinita en la pakaĵo. Se ne, ĝi provas ŝargi ĝin kiel modulo. Se ĝi ne trovas ĝin, ĝi levas escepton ImportError.

Aliaflanke, kiam vi uzas sintakson

import ero.subero.subero

ĉiu ero krom la lasta devas esti pakaĵo; la lasta povas esti modulo aŭ pakaĵo, sed ne povas esti klason aŭ funkion aŭ variablon difinitan in la antaŭa ero.

Uzante * por Importi el Pakaĵo

Kio okazas kiam uzanto skribas instrukcion 

from Sono.Efektoj import * ?

Oni esperus, ke Pitono trovos la submodulojn en la pakaĵo, kaj importos ĉiujn. Bedaŭrinde, ĉi tiu ne okazos ĝuste je sistemoj Makintoŝoj aŭ Vindozoj, kie la dosiersistemo ne ĉiam havas ĝustan informon pri la uskleco de dosiernomoj! Je ĉi tiu sistemoj, oni ne povas certe scii ĉu oni devus importi dosieron EHXO.PY kiel modulon ehxo, Ehxo or EHXO.

La nura solvo estas ke la autoro de la pakaĵo provizas per eksplicita indico de la pakaĵo. Importo uzas la jenan konvencion: Se la kodo en __init__.py de pakaĵo difinas liston nomitan __all__, oni supozas, ke tiu listo enhavas la nomojn de moduloj importotaj se la frazo

from package import * 

estas uzita. La autoro respondecas per certigi, ke la listo ĉiam estas aktuala. Autoroj rajtas ne uzu __all__ ; tiuokaze import * ne estas havebla.

Ekzemple, la dosiero Sono/Efekoj/__init__.py povas enhavi la jenan kodon:

__all__ = ["ehxo", "ĉirkaŭ", "reversi"]

Tio signifas, ke from Sono.Efekoj import * importus la tri nomitajn submodulojn de la Sono pakaĵo.

Rimarku, ke ĝenerale la importo de modulo aŭ pakaĵo per uzo de * estas evitinda, ĉar neklara kodo rezultas. Tamen, estas utila dum interagaj sesioj, kaj se nomoj importitaj indiki iliajn fonton.

Aliaflanke, estas tauga skribi

from Pakaĵo import specifa_submodulo

Fakte, ĉi tiu estas la notacio rekomendita se la modulo importanta ne bezonas uzi submodulojn kiu havas la samajn nomojn el malsmaj pakaĵoj.

Intra-pakaĵa Referencoj

Submoduloj de pakaĵo ofte devas referenci unun al la alia. Ekzemple, la modulo ĉirkaŭ eble uzas la modulon eĥo. Fakte, ĉar tiaj referencoj estas tiel oftaj, la instrukcio import unue kontrolas la enhavantan pakaĵon antaŭ kontroli en la norma serĉvojo.Do, la modulo ĉirkaŭ povas simple uzi instrukcion import eĥo

from eĥo import eĥofiltro


. Se la modulo importota ne esta trovita en la nuna pakaĵo, (pakaĵo en kiu la nuna modulo estas) la instrukcio import serĉas altnivelan modulon tiunomitan.

Kiam pakaĵoj havas subpakaĵojn (ekz. la pakaĵo Sono) ne estas kurtvojo por referenci submodulojn en frataj subpakaĵoj - oni devas uzi la tutan nomon de la subpakaĵo. Ekz. se la modulo Sono.Filtroj.vocoder bezonas uzi la modulon eĥo en la pakaĵo Sono.Efektoj, ĝi uzos formon
from Sono.Efektoj import eĥo

Supren