Olge ettevaatlik, kui tegelete Pythoni argparse’i bool’i väärtustega

Äri

Pythoni käsurea argumentidega tegelemiseks kasutage sys-mooduli argv- või argparse-mooduleid.

Argparse-moodul võimaldab käsurea argumentide paindlikku käsitlemist, kuid Boole'i väärtuste (true, false) käsitlemisel tuleb olla ettevaatlik.

Siin on esitatud järgmine teave.

  • argparse argumentide lihtsaks defineerimiseks
  • Määrake argparse'iga argumendi tüüp (type).
  • Ärge määrake add_argument() argumendi tüübiks “bool”.
  • Kohtuotsus bool()
  • Kasutage argumendi tüübi asemel argumendi toimingut.
  • Funktsiooni strtobool() kasutamine

argparse argumentide lihtsaks defineerimiseks

Argparse-moodul teeb käsurea argumentide defineerimise lihtsaks.

Argparse-mooduli abil on lihtne luua kasutajasõbralikke käsurea liideseid. Te määratlete, milliseid argumente teie programm vajab, ja argparse arvutab välja, kuidas neid valikuid sys.argv-st analüüsida. argparse moodul genereerib automaatselt abi- ja kasutussõnumeid ning tekitab veateate, kui kasutaja määrab programmile valed argumendid. veateate, kui kasutaja määrab programmile valed argumendid.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Määrake argparse'iga argumendi tüüp (type).

Argparse'i kasulikuks funktsiooniks on tüübi (type) määramine.

Näiteks kui määrate täisarvu (int) tüübi, teisendab see automaatselt argumendi tüübiks int ja tekitab vea ka argumendi puhul, mis ei ole int.

Tüüp on määratud add_argument() argumendi tüübiga.

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))

Käivita see fail käsurealt.

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

Argument 100 loetakse kui int.

Kui argumendina kasutatakse väärtust, mis ei ole täisarv, tekib viga.

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

Väga kasulik ootamatute argumentide mängimiseks.

Ärge määrake add_argument() argumendi tüübiks “bool”.

Oluline on märkida, et bool, nagu ka int ja float, ei tööta ootuspäraselt, kui annate add_argument() argumendi tüübiks bool.

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))

Käivita see fail käsurealt.

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

Kui argumendina kasutatakse true, loetakse see bool-tüüpi true. See on oodatav käitumine, kuid probleemiks on järgmine juhtum.

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

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

Kui kasutate argumendina false või mõnda muud stringi, loetakse see true'ks.

Põhjus, miks see juhtub, on see, et kui add_argument() funktsioonis on määratud type=xxx, antakse argument üle xxx() funktsioonile.

Näiteks kui type=int, siis antakse argument üle int(); kui type=float, siis float().

Sama kehtib ka type=bool puhul, mis tähendab, et argument antakse üle bool() funktsioonile.

Kohtuotsus bool()

See bool() on keeruline.

Järgmised väärtused loetakse valeks:

  • None
  • false
  • Null numbrilistes tüüpides. Näiteks järgmised väärtused
    • 0
    • 0.0
    • 0j
  • Tühi jada. Näiteks
    • ''
    • ()
    • []
  • Tühi kaardistus. Näiteks
    • {}

Kõik muud väärtused eeldatakse tõeseks – seega on paljude tüüpide objektid alati tõesed. Operatsioonid ja sisseehitatud funktsioonid, mis annavad booluse tulemuse, annavad alati vale väärtusena 0 või False ja tõese väärtusena 1 või True, kui ei ole märgitud teisiti.

Seetõttu annavad kõik bool() funktsioonile edastatud mitte-tühjad stringid, olenemata sellest, kas need on 'true' või 'false', tagasi true. Ainult tühjad stringid on false.

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

print(bool(''))
# False

Kui type=bool on määratud add_argument() funktsioonis, antakse argument üle bool() funktsioonile. Seega, nagu ülaltoodud näites näidatud, kui argumendina kasutatakse false, konverteerib bool() selle stringiks 'False' ja loeb seda kui true.

Kasutage argumendi tüübi asemel argumendi toimingut.

Kui soovite argparse'is kasutada boolseid väärtusi, määrake argumendi toiminguks 'store_true' või 'store_false'.

  • 'store_true'
  • 'store_false'

Need on 'store_const' eriversioonid, mis salvestavad vastavalt True ja False. Lisaks määravad nad vaikeväärtused vastavalt False ja True, selles järjekorras.
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))

Selles näites on esitatud järgmised valikud.
--enSeega, kui en ei ole seatud tõeseks, laaditakse see false, mis on vaikimisi väärtus en.

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

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

Kui soovite määrata vaikimisi väärtuseks true ja valiku lisamisel false, tehke lihtsalt järgmist.
action='store_false'

Funktsiooni strtobool() kasutamine

Kui soovite valikute asemel kasutada positsioonilisi argumente, võite kasutada ka funktsiooni strtobool().

strtobool() on funktsioon, mis teisendab stringi tõeseks (1) või valeks (0).

Teisendab booluse stringi tõeseks (1) või valeks (0).
Tegelikud väärtused on järgmised

  • y
  • yes
  • true
  • on
  • 1

Vale väärtused on järgmised.

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

Kui val ei ole mõni ülaltoodud väärtustest, tekitab see ValueError.

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

See ei sõltu suur- ja väiketähtedest, seega võite kasutada näiteks järgmist; mis tahes muu string annab vea.

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

Nimi on strtobool(), kuid tagastusväärtus ei ole bool, vaid int (1 või 0).

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

Nagu varem kirjutatud, kui argparse'i funktsioonis add_argument() on määratud type=xxx, antakse argument üle funktsioonile xxx(). Seega saame teha järgmist.
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))

Tagastusväärtus ei ole bool-tüüpi, vaid int-tüüpi 1 või 0, kuid see võib lugeda tõeseid või valesid väärtusi, mille argumentideks on true või false.

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

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

Samuti, kui argument ei ole oodatud, genereeritakse korralikult viga.

$ 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