[python] otázka ohladom mojho štýlu písania v OOP

Hynek Fabian hynek.fabian na firma.seznam.cz
Úterý Leden 15 15:23:21 CET 2013


Vymyslet si muzes cokoliv, jde jen o to jak moc to ma byt chytry a
slozity. Celkem bezny pristup je mit zvlast parser vstupu coz byva
nejaky stavovy stroj, cili instance objektu ktery zere vstup a pada z
nej nejaka abstraktni  reprezentace. V pripade nejakeho interpretru by
to byly objekty reprezentujici prikazy. Cili zjednodusene neco zhruba v
tomto smyslu (YMMV):

for cmd in InputReader(sys.stdin):
    if cmd is GameOver: break
    if cmd.comment: continue
    cmd.process(sys.stdout)


To jen tak ciste akademicky, jestli dobre rozumim o co se snazis tak
vyrabis s prominutim hroznou blbost a nejakej vlastni parser je mimo
diskusi.
To co vidim je (radoby) shell, a nejlepsi shell je shell sam. Trable s
cwd jsou jen to nejmensi z potizi ktere te na soucasnem kurzu cekaji.
Pokud opravdu potrebujes shell se vsim vsudy, tak si proste pust proces
bashe pres popen. V praxi to neni uplne jednoduche protoze budes muset
resit veci kolem emulace terminalu (coz je prakticky to o co se
pokousis) ale je to resitelne – midnight i screen to tak delaji.
Snazit se porozument syntaxi (neznameho!) shellu resitelne neni.
Predstav si takovyhle vstup:
( mkdir /tmp/spam ; chmod 700 /tmp/spam ) && cd /tmp/spam
To je celkem bezny obrat, ver tomu ze opravdovy unixak pro kazdy dalsi
ohak ktery vymyslis najde tri zpusoby jak nebude fungovat.
Nejjednodussi reseni je se smirit s tim ze subshell je subshell a ma
vlastni cwd. Vsechny ostatni programy to tak taky delaji, lidi jsou na
to zvykli a neni na tom nic spatneho.


On 01/14/13 19:18, Roman Beno wrote:
> Na to už som natrafil.
> Čo sa týka Raiczeho kritiky, podobný systém s "odkazom na metódy jednej
> konkrétnej instancie" je uplatnený v module random.
> 
> Ešte by som mal jednu otázku, je to skôr vec názoru.. Nakoľko vyššie
> spomínané príklady sa toho nejak veľmi netýkajú.
> 
> Tak napríklad ten triviálny príklad s triedou PrikazovyRiadok :-)
> 
> V časti
> 
> if __name__="__main__":
>     # čo robit s instaciou(ami) po spustení z termu..
>     ....
> 
> by mohlo byť:
> 
> A)
> inst=PrikazovyRiadok()
> inst.proces()
> 
> alebo
> B)
> urobit metodu proces  tak aby sa self.proces() robil len raz, napr:
> def proces(self):
>    self.prikaz=input("Zadajte: "")
>    if self.prikaz.startswith("cd"):
>         .....
>    elif self.prikaz.startswith("pwd"):
>         .....
>    else:
>        os.system(self.prikaz)
> 
> a potom už v časti if __name__ ....
> inst=PrikazovyRiadok()
> while True:
>    inst.proces()
>    if self.prikaz=="0":
>         break
> 
> atd atd proste v triede stanovit iba to nevyhnutné a prácu s metodami
> instancie nechat do tohto bloku.
> Skor sa však priklanam k možnosti A.
> 
> Ďakujem za odpoved
> Roman



Další informace o konferenci Python