Kini kujdes kur merreni me vlerat Boolean në argparse të Python

biznes

Për të trajtuar argumentet e linjës së komandës në Python, përdorni modulet argv ose argparse të modulit sys.

Moduli argparse lejon trajtimin fleksibël të argumenteve të linjës së komandës, por duhet pasur kujdes kur kemi të bëjmë me vlerat Boolean (true, false).

Informacioni i mëposhtëm jepet këtu.

  • argparse për përcaktim të lehtë të argumenteve
  • Specifikoni llojin e argumentit (lloji) me argparse
  • Mos specifikoni “bool” si lloj argumenti të add_argument()
  • Gjykimi sipas bool()
  • Përdorni veprimin e argumentit në vend të llojit të argumentit.
  • Duke përdorur funksionin strtobool().

argparse për përcaktim të lehtë të argumenteve

Moduli argparse e bën të lehtë përcaktimin e argumenteve të linjës së komandës.

Moduli argparse e bën të lehtë krijimin e ndërfaqeve të linjës komanduese miqësore për përdoruesit. Ju përcaktoni se cilat argumente i nevojiten programit tuaj dhe argparse do të kuptojë se si t’i analizojë ato opsione nga sys.argv. Moduli argparse gjeneron automatikisht mesazhe ndihme dhe përdorimi dhe ngre një gabim nëse përdoruesi specifikon argumente të pavlefshme për programin. gabim kur përdoruesi specifikon argumente të pavlefshme për programin.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Specifikoni llojin e argumentit (lloji) me argparse

Një veçori e dobishme e argparse është të specifikojë llojin (llojin).

Për shembull, nëse specifikoni një lloj të numrit të plotë (int), ai automatikisht do ta konvertojë argumentin në int dhe gjithashtu do të ngrejë një gabim për argumentet që nuk janë int.

Lloji specifikohet nga lloji i argumentit të 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))

Ekzekutoni këtë skedar nga linja e komandës.

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

Argumenti 100 lexohet si int.

Nëse një vlerë jo-int përdoret si argument, do të ndodhë një gabim.

$ 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'

Shumë i dobishëm për të luajtur argumente të papritura.

Mos specifikoni “bool” si lloj argumenti të add_argument()

Është e rëndësishme të theksohet se bool, si int dhe float, nuk do të funksionojë siç pritej nëse specifikoni bool si llojin e argumentit të 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))

Ekzekutoni këtë skedar nga linja e komandës.

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

Nëse true përdoret si argument, ai do të lexohet si një tip bool true. Kjo është sjellja e pritshme, por problemi është rasti i mëposhtëm.

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

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

Nëse përdorni false ose ndonjë varg tjetër si argument, ai do të lexohet si i vërtetë.

Arsyeja pse ndodh kjo është se kur type=xxx specifikohet në add_argument(), argumenti i kalohet xxx().

Për shembull, nëse type=int, argumenti do t’i kalohet int(); nëse type=float, atëherë float().

E njëjta gjë është e vërtetë për type=bool, që do të thotë se argumenti do t’i kalohet bool().

Gjykimi sipas bool()

Ky bool() është i ndërlikuar.

Vlerat e mëposhtme konsiderohen të rreme:

  • None
  • false
  • Zero në llojet numerike. Për shembull, vlerat e mëposhtme
    • 0
    • 0
    • 0j
  • Një sekuencë boshe. Për shembull
    • ()
    • []
  • Hartë bosh. Për shembull
    • {}

Të gjitha vlerat e tjera supozohen të jenë të vërteta – kështu që objektet e shumë llojeve janë gjithmonë të vërteta. Operacionet dhe funksionet e integruara që kthejnë rezultate Boolean gjithmonë kthejnë 0 ose False si vlerë false dhe 1 ose True si vlerë të vërtetë, përveç nëse shënohet ndryshe.

Prandaj, të gjitha vargjet jo bosh të kaluara te bool(), qofshin ‘true’ ose ‘false’, do të kthehen true. Vetëm vargjet boshe do të jenë false.

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

print(bool(''))
# False

Kur type=bool vendoset në add_argument(), argumenti kalon te bool(). Prandaj, siç tregohet në shembullin e mësipërm, nëse false përdoret si argument, ai do të konvertohet nga bool() si vargu ‘False’ dhe do të lexohet si i vërtetë.

Përdorni veprimin e argumentit në vend të llojit të argumentit.

Nëse dëshironi të përdorni vlerat Boolean në argparse, specifikoni ‘store_true’ ose ‘store_false’ për veprimin e argumentit.

  • store_true’
  • store_false’

Këto do të jenë versione speciale të “store_const” që do të ruajnë respektivisht “True” dhe “Fale”. Përveç kësaj, ata do të vendosin vlerat e paracaktuara në False dhe True respektivisht, në atë renditje.
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))

Në këtë shembull, janë dhënë opsionet e mëposhtme.
--enPrandaj, nëse en nuk vendoset si true, do të ngarkohet si false, që është vlera e paracaktuar e en.

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

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

Nëse dëshironi të vendosni parazgjedhjen në true, dhe false kur të shtohet opsioni, thjesht bëni sa më poshtë.
action='store_false'

Duke përdorur funksionin strtobool().

Nëse dëshironi të përdorni argumente pozicionale në vend të opsioneve, mund të përdorni gjithashtu funksionin strtobool().

strtobool() është një funksion që konverton një varg në true (1) ose false (0).

Konverton një varg boolean në true (1) ose false (0).
Vlerat e vërteta janë si më poshtë

  • y
  • yes
  • true
  • on
  • 1

Vlerat false janë si më poshtë.

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

Nëse val nuk është ndonjë nga sa më sipër, ajo ngre ValueError.

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

Nuk është i ndjeshëm ndaj shkronjave të vogla, kështu që për shembull, mund të përdorni sa vijon; çdo varg tjetër do të rezultojë në një gabim.

  • 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'

Emri është strtobool(), por vlera e kthyer nuk është bool, por int (1 ose 0).

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

Siç është shkruar më herët, kur type=xxx është specifikuar në add_argument() të argparse, argumenti do t’i kalohet xxx(). Prandaj, ne mund të bëjmë sa më poshtë.
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))

Vlera e kthyer nuk është një lloj bool, por një lloj int 1 ose 0, por mund të lexojë vlerat e vërteta ose të rreme me të vërtetë ose false si argumente.

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

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

Gjithashtu, nëse argumenti nuk pritet, një gabim do të gjenerohet siç duhet.

$ 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