Vertu varkár þegar þú fjallar um Boolean gildi í Python’s argparse

Viðskipti

Til að meðhöndla skipanalínurök í Python, notaðu argv eða argparse einingar sys einingarinnar.

Argparse einingin gerir ráð fyrir sveigjanlegri meðhöndlun á skipanalínurökum, en gæta þarf varúðar þegar fjallað er um Boolean gildi (satt, ósatt).

Eftirfarandi upplýsingar eru veittar hér.

  • argparse til að auðvelda skilgreiningu á rökum
  • Tilgreindu tegund rökræðunnar (tegund) með argparse
  • Ekki tilgreina „bool“ sem rifrildistegund add_argument()
  • Dómur eftir bool()
  • Notaðu röksemdaaðgerðina í stað rifrildategundarinnar.
  • Með því að nota strtobool() fallið

argparse til að auðvelda skilgreiningu á rökum

Argparse einingin gerir það auðvelt að skilgreina skipanalínurök.

Argparse einingin gerir það auðvelt að búa til notendavæn skipanalínuviðmót. Þú skilgreinir hvaða rök forritið þitt þarfnast, og argparse mun finna út hvernig á að flokka þá valkosti frá sys.argv. argparse eining býr sjálfkrafa til hjálpar- og notkunarskilaboð og vekur villu ef notandinn tilgreinir ógild rök fyrir forritinu. villa þegar notandinn tilgreinir ógildar röksemdir við forritið.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Tilgreindu tegund rökræðunnar (tegund) með argparse

Gagnlegur eiginleiki argparse er að tilgreina gerð (tegund).

Til dæmis, ef þú tilgreinir heiltölu (int) gerð, mun það sjálfkrafa breyta röksemdinni í int og einnig koma upp villu fyrir rök sem eru ekki int.

Gerðin er tilgreind með tegund rifrilda add_argument().

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg_int', type=int)

args = parser.parse_args()
print(args.arg_int)
print(type(args.arg_int))

Keyrðu þessa skrá frá skipanalínunni.

$ python argparse_type_int.py 100
100
<type 'int'>

Rök 100 er lesin sem alþm.

Ef non-int gildi er notað sem rök mun villa koma upp.

$ python argparse_type_int.py foo
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: 'foo'

$ python argparse_type_int.py 1.23
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: '1.23'

Mjög gagnlegt til að spila óvænt rifrildi.

Ekki tilgreina „bool“ sem rifrildistegund add_argument()

Það er mikilvægt að hafa í huga að bool, eins og int og float, mun ekki virka eins og búist var við ef þú tilgreinir bool sem rifrildistegund add_argument().

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=bool)

args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))

Keyrðu þessa skrá frá skipanalínunni.

$ python argparse_type_bool.py True
True
<type 'bool'>

Ef satt er notað sem rök, verður það lesið sem bool tegund true. Þetta er væntanleg hegðun, en vandamálið er eftirfarandi tilfelli.

$ python argparse_type_bool.py False
True
<type 'bool'>

$ python argparse_type_bool.py bar
True
<type 'bool'>

Ef þú notar rangt eða einhvern annan streng sem rök, verður það lesið sem satt.

Ástæðan fyrir því að þetta gerist er sú að þegar type=xxx er tilgreint í add_argument() er röksemdin send til xxx().

Til dæmis, ef type=int, verður röksemdin send til int(); ef type=float, þá flot().

Sama gildir um type=bool, sem þýðir að röksemdin verður send til bool().

Dómur eftir bool()

Þessi bool() er erfiður.

Eftirfarandi gildi eru talin röng:

  • None
  • false
  • Núll í tölulegum gerðum. Til dæmis, eftirfarandi gildi
    • 0
    • 0
    • 0j
  • Tóm röð. Til dæmis
    • ()
    • []
  • Tóm kortlagning. Til dæmis
    • {}

Gert er ráð fyrir að öll önnur gildi séu sönn – þannig eru hlutir af mörgum gerðum alltaf sannir. Aðgerðir og innbyggðar aðgerðir sem skila Boolean niðurstöðum skila alltaf 0 eða False sem rangt gildi og 1 eða True sem satt gildi, nema annað sé tekið fram.

Þess vegna munu allir ótómir strengir sem sendir eru til bool(), hvort sem þeir eru ‘true’ eða ‘false’, skila satt. Aðeins tómir strengir verða rangir.

print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True

print(bool(''))
# False

Þegar type=bool er stillt í add_argument(), er röksemdin send til bool(). Þess vegna, eins og sýnt er í dæminu hér að ofan, ef false er notað sem röksemdafærslan, verður þeim breytt með bool() sem strengnum ‘False’ og lesið sem satt.

Notaðu röksemdaaðgerðina í stað rifrildategundarinnar.

Ef þú vilt nota Boolean gildi í argparse, tilgreindu ‘store_true’ eða ‘store_false’ fyrir rökfærsluaðgerðina.

  • store_true’
  • store_false’

Þetta verða sérstakar útgáfur af ‘store_const’ sem geyma True og False í sömu röð. Að auki munu þeir stilla sjálfgefna gildin á False og True í sömu röð, í þeirri röð.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--en', action='store_true')

args = parser.parse_args()
print(args.en)
print(type(args.en))

Í þessu dæmi eru eftirfarandi valkostir gefnir.
--enÞess vegna, ef en er ekki stillt sem satt, verður það hlaðið sem falskt, sem er sjálfgefið gildi en.

$ python argparse_option_bool.py --en
True
<type 'bool'>

$ python argparse_option_bool.py
False
<type 'bool'>

Ef þú vilt stilla sjálfgefið á satt, og rangt þegar valmöguleikanum er bætt við, gerðu bara eftirfarandi.
action='store_false'

Með því að nota strtobool() fallið

Ef þú vilt nota stöðurök í stað valkosta geturðu líka notað fallið strtobool().

strtobool() er fall sem breytir streng í satt (1) eða ósatt (0).

Breytir boolean streng í satt (1) eða ósatt (0).
Hin sanna gildi eru sem hér segir

  • y
  • yes
  • true
  • on
  • 1

Fölsk gildi eru sem hér segir.

  • n
  • no
  • f
  • false
  • off
  • 0

Ef val er ekki eitthvað af ofangreindu hækkar það ValueError.

9. API Reference – strtobool() — Python 3.10.0 Documentation

Það er ekki hástafaviðkvæmt, svo þú getur til dæmis notað eftirfarandi; hver annar strengur mun leiða til villu.

  • TRUE'
  • True'
  • YES'
from distutils.util import strtobool

print(strtobool('true'))
print(strtobool('True'))
print(strtobool('TRUE'))
# 1
# 1
# 1

print(strtobool('t'))
print(strtobool('yes'))
print(strtobool('y'))
print(strtobool('on'))
print(strtobool('1'))
# 1
# 1
# 1
# 1
# 1

print(strtobool('false'))
print(strtobool('False'))
print(strtobool('FALSE'))
# 0
# 0
# 0

print(strtobool('f'))
print(strtobool('no'))
print(strtobool('n'))
print(strtobool('off'))
print(strtobool('0'))
# 0
# 0
# 0
# 0
# 0

# print(strtobool('abc'))
# ValueError: invalid truth value 'abc'

Nafnið er strtobool(), en skilgildið er ekki bool, heldur int (1 eða 0).

print(type(strtobool('true')))
# <class 'int'>

Eins og skrifað var áðan, þegar type=xxx er tilgreint í add_argument() í argparse, verður röksemdin send til xxx(). Þess vegna getum við gert eftirfarandi.
type=strtobool

import argparse
from distutils.util import strtobool

parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=strtobool)

args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))

Skilagildið er ekki bool tegund, heldur int tegund 1 eða 0, en það getur lesið satt eða rangt gildi með satt eða ósatt sem rök.

$ python argparse_type_strtobool.py true
1
<type 'int'>

$ python argparse_type_strtobool.py false
0
<type 'int'>

Einnig, ef ekki er búist við röksemdinni, mun villa myndast á réttan hátt.

$ python argparse_type_strtobool.py bar
usage: argparse_type_strtobool.py [-h] arg_bool
argparse_type_strtobool.py: error: argument arg_bool: invalid strtobool value: 'bar'
Copied title and URL