[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