Készítsünk HANGMAN játékot! - 2. rész

Folytassuk a kis hangman játékunkat! Az 1. részben elkészítettük a konzolos/terminálos változatunkat, ami működik megy szépen, de mégsem egy "rendes" konzolos program...

Hogy miért? Minden konzolos, linuxos program kezel paranccsori paramétereket, ha mást nem, akkor a --help és a --version opciókat. A --help vagy -h a program vagy parancs használatát írja le röviden, a -v vagy --version pedig a nevét és verziószámát írja ki.



A python remek kis eszközöket biztosít nekünk az argumentum vagy paraméterkezelés megvalósítására. Mi most az getopt modullal ismerkedünk meg.

Mit szeretnénk? Azt, hogy a hangman programocskánk kezelje az alábbi parancssori argumentumokat:
  • -h, --help : ezekre adjon egy rövid használati útmutatót
  • -v, --version : erre adja meg a program verziószámát
  • -f, --file fájlnév : ennek hatására a hangman egyéni szólistát olvas be
A help megjelenítésére készítek egy egyszerű függvényt, amit meghívunk, ha a hangman a -h, --help, vagy ismeretlen argumentummal indul:

def help():
    print """HANGMAN program oktatási célra

Használat:
    python hangman.py [paraméterek]

    Paraméterek:
    -h, --help     : ez a leírás
    -v, --version  : a program verziószáma
    -f fajlnév,
    --file fájlnév : a betöltendő szófájl neve
    """

Először is, a getopt modult be kell importálnunk, ezért az import sorok alá szúrjunk be egy import getopt sort. A program végére az alábbi kódrészlet kerül (lecseréljük az eddigi pár sort ott a végén).

if __name__=="__main__":
    try:
        optlist, args = getopt.getopt(sys.argv[1:], "hvf:", ["help", "version", "file="])
    except getopt.GetoptError:
        help()
        sys.exit(2)
    for opt,param in optlist:
        if opt in ('-h','--help'):
            help()
            sys.exit(0)
        elif opt in ('-v', '--version'):
            print "Hangman játék "+VERZIO
            sys.exit(0)
        elif opt in ('-f','--file'):
            SZOFAJL=param
    
    j=Jatek()

    UJJATEK=True
    while UJJATEK:
        j.start()
        ujjatek=raw_input("Új játék? [i]/n : ")
        if ujjatek in ('n','N'):
            print "Viszlát legközelebb!"
            UJJATEK=False

Mielőtt azonban elmélyednénk a getopt részleteiben, menjünk végig ezen a néhány soron. Az első amit észre kell vennünk, hogy a program lényegi végrehajtó része belekerült egy if blokkba. Mit vizsgálunk ebben? Azt, hogy a hangman.py programként lett-e indítva, vagy beimportálásra csak került. A __name__ beépített változó a __main__ nevet tartalmazza akkor, ha programként indítottuk, és a modulnevet, ha importáltuk. Importáláskor ugyanis nincs szükség programvégrehajtásra a szó köznapi értelmében, olyankor csak az osztályok kellenek nekünk.
  • a 2-6 sorokban beolvassuk a parancssori argumentumainkat az optlist és args változókba. Ha érvénytelen paramétert kaptunk, akkor meghívjuk a help() függvényünket, és 2-es hibakóddal kilépünk.
  • a 7-15 sorban lévő ciklusban végiglépkedünk a kapott agumentumlistán
  • ha -h vagy --help paramétert kaptunk, akkor kiírjuk a helpet, és 0-ás hibakóddal kilépünk (sys.exit(0))
  • ha a paraméter -v vagy --version, akkor kiírjuk a verziószámot, és 0-ás hibakóddal kilépünk (sys.exit(0))
  • ha a paraméter -f vagy --file, akkor a mögötte lévő argumentumot állítjuk be a SZOFAJL váltózba, így a játék induláskor ebből tölti fel a szólistát
  • további újdonság, hogy a végrehajtást egy while ciklusba illesztettük, és a játék véget érte után megkérdezzük a felhasználót, akarja-e folytatni. Ha nem, akkor az UJJATEK változó False-ra állításával kilépünk a while ciklusból, és a program véget ér.
A végére ígértem a getopt részleteit.A

optlist,args=getopt.getopt(argumentumlista, rövidparamétereklistája, hosszúparamétereklistája)

feldolgozza az argumentumlistában lévő elemeket, úgy hogy összehasonlítja a rövid és hosszú paraméterek listájával, majd egy kételemű tuple-t ad vissza, amelnyek első eleme - jelen esetben az optilst -, egy szintén kételemű tuple-kből álló lista, amelyben a kapott paraméterek találhatók a saját argumentumaikkal párosítva, a második elem a kimeneti tuple-ből pedig a paraméterek utáni argumentumokból áll.

Az argumentumlista előállítását a sys modul végzi. Mivel a sys.args[0] mindig a program saját neve, ez nem parancssori paraméter, ezért nem adjuk át a getopt-nak, ezért szeleteljük és a sys.args[1:] listát adjuk át.

A rövidparamétereklistája egy string, amiben megadjuk a getopt-nak, hogy programunk milyen rövid paramétereket kezel le. Ha egy betű után kettőspontot teszünk, akkor az a paraméter saját argumentummal rendelkezik.

A hosszúparamétereklistája egy python lista string elemekkel, amelyek sorrendben a rövid paraméterek hosszú megfelelői, azaz pl. -h --> --help, -v --> --version. Ha a rövid párjánál kettősponttal jeleztük, hogy a paraméternek plusz argumentuma van, akkor a hosszú párjánál egyenlőségjelet kell tennünk ehhez.

Példák:
>>> import getopt
>>> arglist=['-h','--file','fajlnev','-v']
>>> optlist,args=getopt.getopt(arglist,"hf:v",["help",
"file=","version"])
>>> optlist
[('-h', ''), ('--file', 'fajlnev'), ('-v', '')]
>>> args
[]
>>> arglist=['-h','--file','fajlnev','-v','arg1','arg2']
>>> optlist,args=getopt.getopt(arglist,"hf:v",["help",
"file=","version"])
>>> optlist
[('-h', ''), ('--file', 'fajlnev'), ('-v', '')]
>>> args
['arg1', 'arg2']


A v1.1 verzió zippelve elérhető itt.

A következő alkalommal többnyelvűsítjük hangman-ünket.

1 megjegyzés:

  1. Tanulmányozásra ajánlom még az argparse modult, ha igény van rá, körüljárjuk azt is.

    VálaszTörlés