Seite 1 von 1

Frage zu argv

Verfasst: Sonntag 26. März 2006, 11:42
von BernieMan
Hallo Gemeinde,
Als PHP-Umsteiger kämpfe ich mich langsam durch das Dickicht.
Nun habe Ich eine Frage an Euch.
Was ist an folgendem Code falsch:

Code: Alles auswählen

import sys

class Testclass:

    def __init__(self,arg):
        self.arg = arg
        arg = sys.argv[1]
        if arg in ['-h', '--hilfe']: self.__hilfe()
    
    def __hilfe(self):
        print "Testausgabe"
Das Script soll, wenn man den Parameter -h mitgibt, die Funktion __hilfe ausgeben.

Aber irgendwie steige Ich da noch nicht durch.
Für ein wenig Hilfe wäre Ich dankbar.

bis denne
BernieMan

Verfasst: Sonntag 26. März 2006, 11:50
von Python 47
Du musst die Funktion __hilfe(self) erst definieren bevor du sie aufrufen kannst!

//edit: So müsste es also aussehen:

Code: Alles auswählen

import sys

class Testclass:
   def __hilfe(self):
        print "Testausgabe"

    def __init__(self,arg):
        self.arg = arg
        arg = sys.argv[1]
        if arg in ['-h', '--hilfe']: self.__hilfe()    

Verfasst: Sonntag 26. März 2006, 11:59
von Hannes-Spz
klappt doch, was du nur hast... :D (naja, vl. nicht so, wie sie dasteht, aber...)

aber ein bissel verdächtig finde ich, dass du die klasse gar nicht erst aufrufst.
schreib doch bitte sowas ähnliches wie

Code: Alles auswählen

meine_klasse = Testclass("irgendwas")
an das ende deiner datei, damit du die klasse auch wirklich benutzt :wink:
und außerdem würde ich es total verwirrend finden, käme einmal ein 'self.arg' und
ein 'arg' drin vor... denn wenn du ständig argumente angeben musst, sie aber nicht nutzt isses doch hirnrissig... (*sorry*)
hab sie mal nen bissel verändert, wenn du erlaubst :wink:

Code: Alles auswählen

class Testclass: 

    import sys
    def __init__(self): 
        self.arg = sys.argv[1] 
        if self.arg in ('-h', '--hilfe'): self.hilfe() 
    
    def hilfe(self): 
        print "Testausgabe" 

g = Testclass() # initialisiert die klasse/das objekt

Verfasst: Sonntag 26. März 2006, 12:02
von Hannes-Spz
@python-master:
nix gegen dich oder so, aber das muss man nicht machen!
er findet sich die funktion selbst, da die klasse erst föllig abgearbeitet wurde, bevor sie zum laufen gebracht wurde...
wäre die funktion nicht in einer klasse, hättest du aber recht!
(*sorry*)
//edit: und auch DU hast kein lauffähiges script gepostet, da die aufrufende zeile fehlt...

Verfasst: Sonntag 26. März 2006, 12:03
von BernieMan
Hallo PM47,

Klingt logisch -
Aber der Code funktioniert dennoch nicht und Ich wüsste gerne warum.

Grüsse BM

Verfasst: Sonntag 26. März 2006, 12:07
von Python 47
@Hannes Spaz: Ja hast recht war jetzt ein Denkfehler von mir!Hab nicht drauf geachtet, das die Funktion in der Klasse steht! Die Klasse aufzurufen, sollte er doch selber schaffen!

Verfasst: Sonntag 26. März 2006, 12:13
von BernieMan
Also Leute,
ich bin noch am Lernen und am Buch lesen und für jede Anregung dankbar.
@Hannes-Spz
Dein 'hirnrissig' sehe Ich als Anfänger locker. Also kein Problem.

Danke für Eure Hilfe ...

Grüsse BM

Verfasst: Sonntag 26. März 2006, 12:15
von Hannes-Spz
@Python-Master-47
das will ich ihm nicht unterstellen, aber sieh mal:
wenn sich irgendwer hier ein bissel wissen anlesen mag, wäre es immer schön, hätte
er gleich ein ganzes, komplettes, funktionierendes code-stückchen, damit er es sogleich
ausprobieren kann ... - find ich!
und wenn man vl. in php (davon hab ich keine ahnung)
die klassen nicht aufrufen MUSS, dann ist es für diesen benutzer sicherlich eindeutig,
dass man das in einer anderen sprache auch nicht tun muss!

@BernieMan:
wenn es nicht daran lag, dass die klasse nicht aufgerufen wurde,
hätte ich jetzt übrigens nur noch als letzten tipp, dass der komandozeilenparameter
falsch übergeben wurde und das script sich nur DESHALB nicht ausführen lässt...

Verfasst: Sonntag 26. März 2006, 14:01
von Leonidas
Damit es mal irgendwie vorran geht poste ich einfach mal ein funktionierendes, lauffähiges Script:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

class Testclass(object):
    def __init__(self, arg):
        self.arg = arg
        
        if self.arg in ['-h', '--hilfe']: 
            self.__hilfe()
   
    def __hilfe(self):
        print "Testausgabe"

def main():
    tc = Testclass('-h')

if __name__ == '__main__':
    main()
Zu erst einmal: wenn etwas unklar ist, erkläre ich es gerne.

In Zeile 1 und 2 ist erstmal die Shebang und das Encoding. Beides schadet nie und ist generell zu empfehlen.
Zeile 4 besagt, dass die Klasse Testclass von dem Objekt object erbt, also ist es eine New-Style Klasse. Ist im moment zwar nicht nötig, ich habe es mir aber Angewöhnt meine Klassen immer als New-Style Klassen zu definieren.
Die if-Anweisung in Zeile 8 habe ich auf zwei Zeilen aufgeteilt. Das ist klarer und entspricht dem Python Styleguide.
In Zeile 14 habe ich eine Funktion main() angelegt, die das Programm steuert. Die Ähnlichkeit mit der int main() aus C und C++ ist in diesem Fall durchaus erwünscht.
Zeilen 17 & 18 sind der Import-Hook. Das bedeutet, dass main() nur ausgeführt wird, wenn das Script direkt gestartet wird, wenn das Programm importiert wird wird main() nicht aufgerufen. Auch wieder etwas was hilfreich ist und nie schadet.

Achja, zum Parsen der Kommandozeilenoptionen gibt es schon das Modul optparse, welches seine Aufgabe sehr gut erfüllt. Seitdem es in der Stdlib ist, schreibe ich meine Parser nicht mehr selbst.

Re: Frage zu argv

Verfasst: Sonntag 26. März 2006, 14:03
von gerold
BernieMan hat geschrieben:Was ist an folgendem Code falsch:

Code: Alles auswählen

import sys

class Testclass:

    def __init__(self,arg):
        self.arg = arg
        arg = sys.argv[1]
        if arg in ['-h', '--hilfe']: self.__hilfe()
    
    def __hilfe(self):
        print "Testausgabe"
Hi BernieMan!

Da läuft noch ein wenig daneben. Das ist aber nicht schlimm, es sind nur ein paar kleine Anfängerfehler:

- Du definierst den Parameter "arg", der irgendetwas übergeben bekommen soll. Nur was???
- Du definierst die Variable "self.arg", die du aber im gesamten Code nicht weiter verwendest.
- Du erstellst eine Klasse, rufst sie aber nicht auf.

Hier ein kleines Beispiel, in dem innerhalb der Klasse "sys.argv" ausgewertet wird:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys


#----------------------------------------------------------------------
class Testclass:
    
    #----------------------------------------------------------------------
    def __init__(self):
            
        args = sys.argv[1:] # alle Parameter, nur nicht der Programmname
        
        if ('-h' in args) or ('--help' in args): 
            self.hilfe()
        else:
            self.arbeite()

   
    #----------------------------------------------------------------------
    def hilfe(self):
        print "Testausgabe" 


    #----------------------------------------------------------------------
    def arbeite(self):
        print "Dann tun wir mal etwas..."



#----------------------------------------------------------------------
def main():
    t = Testclass()


#----------------------------------------------------------------------
if __name__ == "__main__":
    main()
mfg
Gerold
:-)

PS: In der Vorschau sehe ich soeben, dass Leonidas wieder mal ein wenig schneller war. :o

Re: Frage zu argv

Verfasst: Sonntag 26. März 2006, 14:13
von gerold
gerold hat geschrieben:In der Vorschau sehe ich soeben, dass Leonidas wieder mal ein wenig schneller war.
Dann muss ich noch einen drauf legen. ;-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys

class Testclass:
    
    def hilfe(self):
        print "Testausgabe" 

    def arbeite(self):
        print "Dann tun wir mal etwas..."


def main():
    args = sys.argv[1:] # alle Parameter, nur nicht der Programmname
    t = Testclass()
    if ('-h' in args) or ('--help' in args): 
        t.hilfe()
    else:
        t.arbeite()

if __name__ == "__main__":
    main()
Ich würde die Kommandozeilenparameter in der Funktion "main()" prüfen, da hier drinnen fest steht, dass das Modul nicht importiert sondern direkt aufgerufen wurde. Falls das Modul importiert wurde, kann der Programmierer direkt entscheiden, welche der Klassenmethoden aufgerufen werden soll. So mischt sich dieses Modul nicht in die Parameterauswertung importierender Programme ein.

mfg
Gerold
:-)

Verfasst: Sonntag 26. März 2006, 14:16
von modelnine
Warum benutzt hier keiner optparse oder getopt? Siehe die entsprechenden Beispiele aus der stdlib.

Verfasst: Sonntag 26. März 2006, 14:21
von gerold
modelnine hat geschrieben:Warum benutzt hier keiner optparse oder getopt?
Hi modelnine!

Ich denke mal, weil es nur ein Anfängerbeispiel ist um die Grundlagen zu verstehen. Es geht nicht primär um das Auswerten der Kommandozeilenargumente.

lg
Gerold
:-)

Verfasst: Sonntag 26. März 2006, 14:29
von Leonidas
modelnine hat geschrieben:Warum benutzt hier keiner optparse oder getopt? Siehe die entsprechenden Beispiele aus der stdlib.
Habe ich doch vorgeschlagen:
Leonidas hat geschrieben:Achja, zum Parsen der Kommandozeilenoptionen gibt es schon das Modul optparse, welches seine Aufgabe sehr gut erfüllt.
qerold hat geschrieben:Ich denke mal, weil es nur ein Anfängerbeispiel ist um die Grundlagen zu verstehen. Es geht nicht primär um das Auswerten der Kommandozeilenargumente.
*zustimmend-nick*

Verfasst: Sonntag 26. März 2006, 14:56
von modelnine
Habe ich doch vorgeschlagen:
Huh, hab ich nicht gelesen...

Verfasst: Sonntag 26. März 2006, 14:56
von BernieMan
Hey Ihr seid aber gut drauf und habt ein Ohr für Anfänger ...

Vielen Dank für die Beispiele und Erklärungen. Das hat mir sehr geholfen. Wenn der Grundtenor in diesem Forum generell so ausfällt, dann bleibe ich in jedem Falle hier ... *begeistertbin*

Grüsse BM

Re: Frage zu argv

Verfasst: Sonntag 26. März 2006, 15:04
von Leonidas
gerold hat geschrieben:
gerold hat geschrieben:In der Vorschau sehe ich soeben, dass Leonidas wieder mal ein wenig schneller war.
Dann muss ich noch einen drauf legen. ;-)
Da bleibe ich nicht dahinter zurück:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import optparse

class Testclass(object):
    def __init__(self):
        parser = optparse.OptionParser()
        parser.add_option('-m', '--myhelp', action='callback', callback=self.hilfe)
                  
        options, args = parser.parse_args()
   
    def hilfe(self, option, opt, value, parser):
        print "Testausgabe"

def main():
    tc = Testclass()

if __name__ == '__main__':
    main()
Wobei optparse automatisch die -h und --help Optionen erstellt :)

Verfasst: Sonntag 26. März 2006, 18:16
von Python 47
Hannes-Spz hat geschrieben:@Python-Master-47
das will ich ihm nicht unterstellen, aber sieh mal:
wenn sich irgendwer hier ein bissel wissen anlesen mag, wäre es immer schön, hätte
er gleich ein ganzes, komplettes, funktionierendes code-stückchen, damit er es sogleich
ausprobieren kann ... - find ich!
und wenn man vl. in php (davon hab ich keine ahnung)
die klassen nicht aufrufen MUSS, dann ist es für diesen benutzer sicherlich eindeutig,
dass man das in einer anderen sprache auch nicht tun muss!
Ok hast ja recht!Werd in Zukunft, vollständige Codes posten! 8)

Re: Frage zu argv

Verfasst: Sonntag 26. März 2006, 19:13
von gerold
Leonidas hat geschrieben:Da bleibe ich nicht dahinter zurück
:D