Seite 1 von 1

Problem mit dem Modul '' optparse ''

Verfasst: Mittwoch 17. Januar 2007, 16:53
von EnTeQuAk
So...


ich bastel grad ein wenig mit '' optparse '' rum. Das ist wirklich wundervoll aber eines stört mich:

Wenn ich die Optionen und Argumente parsen lasse:

Code: Alles auswählen

options, args = parser.parse_args()
bekomme ich bei '' options '' etwas komisches.

Es ist dort zwar schön, auf Argumente via '' options.argument '' zugreifen zu können. Aber spätestens beim iterieren gehts nicht mehr weiter.

Ich möchte in einer Iteration prüfen, ob alle Variablen gesetzt sind:

Code: Alles auswählen

for req_opt in _required_options:
        if opts.req_opt:
            continue
        # ...
 
So. Und exakt hier gehts nicht.

'' opts '' ist zwar, wenn ich es mit '' print '' ausgebe ein dictionary. Aber der Typ dieser Variablen ist nicht '' dict ''

Ist es irgentwie möglich die '' options '', die von '' optparse '' zurückgegeben werden wie ein Dictionary zu behandeln?

Code: Alles auswählen

for req_opt in _required_options:
        if opts['req_opt']:
            continue
 
das wäre zuu schön ;)

MfG EnTeQuAk

Verfasst: Mittwoch 17. Januar 2007, 17:04
von BlackJack
Du kannst natürlich mit `getattr()` arbeiten, aber vielleicht solltest Du Deine Kommandozeilen-API überdenken. "required options" ist ein Widerspruch in sich. Wenn man etwas unbedingt angeben muss, dann ist es keine Option, sondern eigentlich ein Argument.

Verfasst: Mittwoch 17. Januar 2007, 17:15
von EnTeQuAk
Ja, es geht darum, das der Benutzer über die Commandozeile Bestimmte Sachen vorher eingeben kann. Aber nicht muss! --

Wenn er es nicht eingibt wird er abgefragt, sollte die Eingabe erforderlich sein, für den Ablauf des Programms.
Wenn man etwas unbedingt angeben muss, dann ist es keine Option, sondern eigentlich ein Argument
Wo wir gerade dabei sind. Was hat das '' args '' in optparse überhaupt zu suchen, hab ich mich öfters gefragt.

Wann und unter welchen Umständen bekommt '' args '' einen Inhalt?

EDIT:

;) habs gefunden :d

Wenn ich also folgendes mache:

Code: Alles auswählen

parser = OptionParser()
parser.add_option('-p', metavar='PROJ', dest='project')
opts, args = parser.parse_args(sys.argv[1:])
Dann werden in '' args '' alle überbleibsel übergeben ;)
Ach ja.. Dokulesen kann so erfrischend sein.


Ich werde mir mal dieses getattr() anschauen.

Aber ich habe immo ne andere Lösung gefunden:

Code: Alles auswählen

if not opts.project:
    #...
elif not opts.template:
    #....
Ist immo die wohl einfachste Variante ;)
So werden auch alle Sachen, die nicht vorhanden sind abgefragt ;)

Denn wer die Zeit hat, eine Variable in eine Liste einzutragen sollte auch für ein einfaches 'if', 'elif', 'else' konstrukt die Zeit haben ;)

Mal schauen, vllt. finde ich noch etwas anderes.

MfG EnTeQuAk

Verfasst: Mittwoch 17. Januar 2007, 17:26
von CM
Hoi,

ein Beispiel, wie ich es lösen würde:

Code: Alles auswählen

from optparse import OptionParser

__doc__ = "Deine Information für den User"

def main():

    parser = OptionParser(usage=__doc__)
    parser.add_option("-o", "--outputfile", action="store", type="string", dest="o
utput", help="use to name the outputfile")
    #weitere options ...

    #Kontrolle der Options und Info an den User
    (options, args) = parser.parse_args()

    if options.output:
        output = options.output
        print "specified output file name: %s " % output
    else:
        print "Choosing no output at all: default option"
        output = None
Also: Wenn der User -o "ein String" gibt, so wird dieser verwendet, ansonsten - unter else - wird ein Default verwendet. Das Ganze ist Copy&Paste&Schnellverstümmelt aus einem Skript von mir.

HTH
Christian

Verfasst: Mittwoch 17. Januar 2007, 17:30
von EnTeQuAk
:D -- siehe mein Edit oben ;)

Danke trotzdem für dein Beispiel... so langsam komme ich immer besser mit 'optparse' klar ;) -- die Doku ist echt aufschlussreich :D


MfG EnTeQuAk

Verfasst: Mittwoch 17. Januar 2007, 17:39
von Rebecca
CM hat geschrieben:Also: Wenn der User -o "ein String" gibt, so wird dieser verwendet, ansonsten - unter else - wird ein Default verwendet.
Mmh, dafuer kann man doch defaults vorgeben?

Code: Alles auswählen

parser.set_defaults(configfile=False, system=False, mode="Basic",
                        nocurses=False, nomouse=False);

parser.add_option("--file", "-f", action="store_true", dest="configfile",
                      help = "blabla");
...

Re: Problem mit dem Modul '' optparse ''

Verfasst: Mittwoch 17. Januar 2007, 17:46
von gerold
EnTeQuAk hat geschrieben:Ist es irgentwie möglich die '' options '', die von '' optparse '' zurückgegeben werden wie ein Dictionary zu behandeln?
Hi EnTeQuAk!

Das was du als ``options`` zurück bekommst, ist eine Klasse mit dynamisch hinzugefügten Attributen.

Bei Klasseninstanzen kann man mit ``__dict__`` auf alle Attribute zurück greifen.

options.__dict__ gibt dir also ein Dictionary mit den Optionen und deren Werte zurück. Damit kannst du über alle Optionen iterieren.

lg
Gerold
:-)

Verfasst: Mittwoch 17. Januar 2007, 17:47
von CM
Ups, richtig: Habe ich lange nicht genutzt und dann dummerweise aus einem "frühen Skript" kopiert. Sorry, EnTeQuAk, war nicht sonderlich clever von mir.

Gruß,
Christian

Verfasst: Mittwoch 17. Januar 2007, 18:19
von BlackJack
Rebecca hat geschrieben:Mmh, dafuer kann man doch defaults vorgeben?

Code: Alles auswählen

parser.set_defaults(configfile=False, system=False, mode="Basic",
                        nocurses=False, nomouse=False);

parser.add_option("--file", "-f", action="store_true", dest="configfile",
                      help = "blabla");
...
Die würde ich aber bei den einzelnen Optionen angeben und nicht in einem extra Aufruf. Das reisst etwas auseinander was IMHO auch räumlich zusammengehört.

Verfasst: Mittwoch 17. Januar 2007, 19:37
von EnTeQuAk
Das was du als ``options`` zurück bekommst, ist eine Klasse mit dynamisch hinzugefügten Attributen.

Bei Klasseninstanzen kann man mit ``__dict__`` auf alle Attribute zurück greifen.

options.__dict__ gibt dir also ein Dictionary mit den Optionen und deren Werte zurück. Damit kannst du über alle Optionen iterieren.
Das ist nen Supertipp. Habe es ausprobiert und klappt. ;)

Herzlichen Dank! -- nun geht wieder alles, was ich wollte :)


MfG EnTeQuAk

Verfasst: Donnerstag 18. Januar 2007, 09:55
von Rebecca
BlackJack: Ich habe mich an diesen Vorschlag gehalten: http://docs.python.org/lib/optparse-default-values.html
[...] A clearer way to specify default values is the set_defaults() method [...]

Verfasst: Donnerstag 18. Januar 2007, 10:16
von BlackJack
Rebecca hat geschrieben:BlackJack: Ich habe mich an diesen Vorschlag gehalten: http://docs.python.org/lib/optparse-default-values.html
[...] A clearer way to specify default values is the set_defaults() method [...]
Das "klarer" gilt aber IMHO nur für den Fall, der vor diesem Satz behandelt wird, nämlich wenn mehrere Optionen die gleiche Zielvariable haben. Das ist zumindest in meinen Programmen eher die Ausnahme als die Regel.