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:
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
-- siehe mein Edit oben
Danke trotzdem für dein Beispiel... so langsam komme ich immer besser mit 'optparse' klar
-- die Doku ist echt aufschlussreich
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
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.