Problem mit dem Modul '' optparse ''

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Problem mit dem Modul '' optparse ''

Beitragvon EnTeQuAk » Mittwoch 17. Januar 2007, 16:53

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
BlackJack

Beitragvon BlackJack » Mittwoch 17. Januar 2007, 17:04

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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 17. Januar 2007, 17:15

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
Zuletzt geändert von EnTeQuAk am Mittwoch 17. Januar 2007, 17:28, insgesamt 1-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 17. Januar 2007, 17:26

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 17. Januar 2007, 17:30

: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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 17. Januar 2007, 17:39

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");
...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Problem mit dem Modul '' optparse ''

Beitragvon gerold » Mittwoch 17. Januar 2007, 17:46

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 17. Januar 2007, 17:47

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
BlackJack

Beitragvon BlackJack » Mittwoch 17. Januar 2007, 18:19

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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 17. Januar 2007, 19:37

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Donnerstag 18. Januar 2007, 09:55

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 [...]
BlackJack

Beitragvon BlackJack » Donnerstag 18. Januar 2007, 10:16

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder