Legyünk óvatosak, amikor Boolean értékekkel foglalkozunk a Python argparse-jában

Üzleti

A parancssori argumentumok kezeléséhez Pythonban a sys modul argv vagy argparse moduljait használhatja.

Az argparse modul lehetővé teszi a parancssori argumentumok rugalmas kezelését, de óvatosnak kell lenni a Boolean értékek (true, false) kezelésénél.

A következő információk itt találhatók.

  • argparse az argumentumok egyszerű definiálásához
  • Az argumentum típusának (type) megadása az argparse paranccsal
  • Ne adjon meg “bool”-t az add_argument() argumentumtípusaként.
  • Ítélet bool()
  • Az argumentumtípus helyett az argumentum művelet használata.
  • A strtobool() függvény használata

argparse az argumentumok egyszerű definiálásához

Az argparse modul megkönnyíti a parancssori argumentumok definiálását.

Az argparse modul megkönnyíti a felhasználóbarát parancssori felületek létrehozását. Meghatározza, hogy milyen argumentumokra van szüksége a programjának, és az argparse kitalálja, hogyan elemezze ezeket az opciókat a sys.argv-ből. argparse modul automatikusan létrehozza a súgó- és használati üzeneteket, és hibát jelez, ha a felhasználó érvénytelen argumentumokat ad meg a programhoz. hibát, ha a felhasználó érvénytelen argumentumokat ad meg a programhoz.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Az argumentum típusának (type) megadása az argparse paranccsal

Az argparse hasznos funkciója a típus (type) megadása.

Ha például egész szám (int) típust ad meg, a program automatikusan int-té konvertálja az argumentumot, és hibát jelez a nem int típusú argumentumok esetén.

A típust az add_argument() argumentumtípusa határozza meg.

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

Futtassa ezt a fájlt a parancssorból.

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

A 100-as argumentumot int-ként olvassa.

Ha nem-int értéket használunk argumentumként, hiba lép fel.

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

Nagyon hasznos a váratlan érvek lejátszásához.

Ne adjon meg “bool”-t az add_argument() argumentumtípusaként.

Fontos megjegyezni, hogy a bool, akárcsak az int és a float, nem fog a várt módon működni, ha az add_argument() argumentumtípusaként bool-t adunk meg.

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

Futtassa ezt a fájlt a parancssorból.

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

Ha true-t használunk argumentumként, akkor az true típusú boolként lesz olvasva. Ez az elvárt viselkedés, de a problémát a következő eset jelenti.

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

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

Ha false vagy bármilyen más karakterláncot használsz argumentumként, az true-ként lesz olvasva.

Ennek az az oka, hogy amikor az add_argument() függvényben type=xxx van megadva, az argumentum az xxx() függvénynek kerül átadásra.

Például, ha type=int, akkor az argumentum az int() függvénynek lesz átadva; ha type=float, akkor a float() függvénynek.

Ugyanez igaz a type=bool értékre is, ami azt jelenti, hogy az argumentum a bool() függvénynek lesz átadva.

Ítélet bool()

Ez a bool() egy trükkös feladat.

A következő értékek hamisnak minősülnek:

  • None
  • false
  • Nulla numerikus típusoknál. Például a következő értékek
    • 0
    • 0.0
    • 0j
  • Egy üres sorozat. Például
    • ''
    • ()
    • []
  • Üres leképezés. Például
    • {}

Minden más értékről feltételezzük, hogy igaz – így a sokféle típusú objektumok mindig igazak. A Boolean eredményt adó műveletek és beépített függvények mindig 0 vagy False értéket adnak vissza hamis értékként, és 1 vagy True értéket igaz értékként, hacsak másképp nem jelölik.

Ezért a bool()-nak átadott minden nem üres karakterlánc, akár 'true', akár 'false', igazat fog visszaadni. Csak az üres karakterláncok lesznek false-ok.

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

print(bool(''))
# False

Ha az add_argument() függvényben a type=bool érték van megadva, akkor az argumentum a bool() függvénynek kerül átadásra. Ezért, ahogy a fenti példában látható, ha false-t használunk argumentumként, akkor a bool() a 'False' karakterlánccá konvertálja és true-ként olvassa be.

Az argumentumtípus helyett az argumentum művelet használata.

Ha Boolean értékeket szeretne használni az argparse-ban, adja meg a 'store_true' vagy 'store_false' értéket az argumentum művelethez.

  • 'store_true'
  • 'store_false'

Ezek a 'store_const' speciális változatai lesznek, amelyek True és False értékeket tárolnak. Ezenkívül az alapértelmezett értékeket False-ra és True-ra állítják be, ebben a sorrendben.
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))

Ebben a példában a következő beállítások vannak megadva.
--enEzért, ha az en nincs true értékként beállítva, akkor false értékként fog betöltődni, ami az en alapértelmezett értéke.

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

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

Ha azt szeretné, hogy az alapértelmezett érték igaz legyen, és hamis, amikor az opciót hozzáadjuk, tegye a következőket.
action='store_false'

A strtobool() függvény használata

Ha opciók helyett pozicionális argumentumokat szeretne használni, használhatja az strtobool() függvényt is.

A strtobool() egy olyan függvény, amely egy karakterláncot igaz (1) vagy hamis (0) értékűvé alakít.

Egy boolean karakterláncot igaz (1) vagy hamis (0) értékre konvertál.
A valós értékek a következők

  • y
  • yes
  • true
  • on
  • 1

A hamis értékek a következők.

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

Ha val nem a fentiek egyike sem, akkor ValueError hibaüzenetet ad.

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

Nem érzékeny a nagy- és kisbetűkre, így például használhatja a következőt; bármely más karakterlánc hibát fog eredményezni.

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

A neve strtobool(), de a visszatérési értéke nem bool, hanem int (1 vagy 0).

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

Ahogy korábban írtuk, ha az argparse add_argument() parancsában type=xxx van megadva, az argumentum az xxx() parancsnak lesz átadva. Ezért a következőket tehetjük.
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))

A visszatérési érték nem bool típusú, hanem int típusú 1 vagy 0, de true vagy false értékeket tud olvasni true vagy false argumentummal.

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

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

Továbbá, ha az argumentum nem elvárt, a rendszer hibaüzenetet generál.

$ 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