Es scheint einige Verwirrung darüber zu geben, was type=bool
und type='bool'
bedeuten könnten. Sollte eines (oder beide) bedeuten 'führe die Funktion bool()
aus' oder 'gib einen booleschen Wert zurück'? So wie es ist, bedeutet type='bool'
nichts. add_argument
gibt einen Fehler 'bool' is not callable
aus, genauso wie wenn du type='foobar'
oder type='int'
verwenden würdest.
Aber argparse
hat ein Register, das es dir ermöglicht, Schlüsselwörter wie dieses zu definieren. Es wird hauptsächlich für action
verwendet, z.B. `action='store_true'. Du kannst die registrierten Schlüsselwörter mit folgendem Befehl anzeigen:
parser._registries
was ein Wörterbuch anzeigt
{'action': {None: argparse._StoreAction,
'append': argparse._AppendAction,
'append_const': argparse._AppendConstAction,
...
'type': {None: }}
Es gibt viele Aktionen, die definiert sind, aber nur ein Typ, der Standardtyp, argparse.identity
.
Dieser Code definiert ein 'bool' Schlüsselwort:
def str2bool(v):
#susendbergs Funktion
return v.lower() in ("yes", "true", "t", "1")
p = argparse.ArgumentParser()
p.register('type','bool',str2bool) # füge Typ-Schlüsselwort zu Registrierungen hinzu
p.add_argument('-b',type='bool') # benutze nicht 'type=bool'
# p.add_argument('-b',type=str2bool) # funktioniert genauso gut
p.parse_args('-b false'.split())
Namespace(b=False)
parser.register()
ist nicht dokumentiert, aber auch nicht verborgen. Im Großen und Ganzen muss der Programmierer nicht darüber Bescheid wissen, da type
und action
Funktionen und Klassenwerte übernehmen. Es gibt viele Beispiele auf stackoverflow, wie man benutzerdefinierte Werte für beide definiert.
Falls es nicht offensichtlich aus der vorherigen Diskussion ist, bedeutet bool()
nicht 'analysiere einen String'. Aus der Python-Dokumentation:
bool(x): Konvertiere einen Wert zu einem Boolean, unter Verwendung des standardmäßigen Wahrheitstests.
Vergleiche dies mit
int(x): Konvertiere eine Zahl oder einen String x in eine Ganzzahl.