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.
- bool() — Built-in Functions — Python 3.10.0 Documentation
- Truth Value Testing — Built-in Types — Python 3.10.0 Documentation
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.--en
Ezé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'