Na spracovanie argumentov príkazového riadku v jazyku Python použite moduly argv alebo argparse modulu sys.
Modul argparse umožňuje flexibilné spracovanie argumentov príkazového riadku, ale pri práci s logickými hodnotami (true, false) je potrebné postupovať opatrne.
Tu sú uvedené tieto informácie.
- argparse na jednoduché definovanie argumentov
- Zadanie typu argumentu (type) pomocou argparse
- Nezadávajte „bool“ ako typ argumentu funkcie add_argument()
- Rozsudok podľa bool()
- Namiesto typu argumentu použite akciu argumentu.
- Použitie funkcie strtobool()
argparse na jednoduché definovanie argumentov
Modul argparse uľahčuje definovanie argumentov príkazového riadka.
Modul argparse uľahčuje vytváranie používateľsky prívetivých rozhraní príkazového riadka. Definujete, aké argumenty váš program potrebuje, a modul argparse zistí, ako tieto možnosti analyzovať zo súboru sys.argv. modul argparse automaticky generuje nápovedu a správy o použití a vyvolá chybu, ak používateľ zadá programu neplatné argumenty. error when the user speciies invalid arguments to the program.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation
Zadanie typu argumentu (type) pomocou argparse
Užitočnou funkciou argparse je zadanie typu (type).
Ak napríklad zadáte typ integer (int), automaticky sa argument skonvertuje na int a pri argumentoch, ktoré nie sú int, sa tiež vyhlási chyba.
Typ je určený typom argumentu funkcie 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))
Spustite tento súbor z príkazového riadku.
$ python argparse_type_int.py 100
100
<type 'int'>
Argument 100 sa číta ako int.
Ak sa ako argument použije iná ako intová hodnota, dôjde k chybe.
$ 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'
Veľmi užitočné pri hraní neočakávaných hádok.
Nezadávajte „bool“ ako typ argumentu funkcie add_argument()
Je dôležité poznamenať, že bool, rovnako ako int a float, nebude fungovať podľa očakávania, ak zadáte bool ako typ argumentu funkcie 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))
Spustite tento súbor z príkazového riadku.
$ python argparse_type_bool.py True
True
<type 'bool'>
Ak sa ako argument použije true, bude sa čítať ako typ bool true. Toto je očakávané správanie, ale problémom je nasledujúci prípad.
$ python argparse_type_bool.py False
True
<type 'bool'>
$ python argparse_type_bool.py bar
True
<type 'bool'>
Ak ako argument použijete false alebo akýkoľvek iný reťazec, bude sa čítať ako true.
Dôvodom je, že ak je v príkaze add_argument() zadané type=xxx, argument sa odovzdá príkazu xxx().
Napríklad, ak type=int, argument bude odovzdaný funkcii int(); ak type=float, potom float().
To isté platí pre type=bool, čo znamená, že argument bude odovzdaný funkcii bool().
Rozsudok podľa bool()
Táto funkcia bool() je zložitá.
- bool() — Built-in Functions — Python 3.10.0 Documentation
- Truth Value Testing — Built-in Types — Python 3.10.0 Documentation
Nasledujúce hodnoty sa považujú za nepravdivé:
- None
- false
- Nula v číselných typoch. Napríklad tieto hodnoty
- 0
- 0.0
- 0j
- Prázdna sekvencia. Napríklad
- ''
- ()
- []
- Prázdne mapovanie. Napríklad
- {}
Všetky ostatné hodnoty sa považujú za pravdivé – teda objekty mnohých typov sú vždy pravdivé. Operácie a vstavané funkcie, ktoré vracajú logické výsledky, vždy vracajú 0 alebo False ako nepravdivú hodnotu a 1 alebo True ako pravdivú hodnotu, ak nie je uvedené inak.
Preto všetky neprázdne reťazce odovzdané funkcii bool(), či už 'true' alebo 'false', vrátia true. Iba prázdne reťazce budú false.
print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True
print(bool(''))
# False
Ak je v add_argument() nastavené type=bool, argument sa odovzdá funkcii bool(). Preto, ako je uvedené v príklade vyššie, ak sa ako argument použije false, bude prevedený funkciou bool() ako reťazec „False“ a prečítaný ako true.
Namiesto typu argumentu použite akciu argumentu.
Ak chcete v argparse použiť logické hodnoty, zadajte pre akciu argumentu 'store_true' alebo 'store_false'.
- 'store_true'
- 'store_false'
Budú to špeciálne verzie 'store_const', ktoré budú ukladať True a False. Okrem toho nastavia predvolené hodnoty na False a True v tomto poradí.
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))
V tomto príklade sú uvedené tieto možnosti.--en
Ak teda en nie je nastavené ako true, načíta sa ako false, čo je predvolená hodnota en.
$ python argparse_option_bool.py --en
True
<type 'bool'>
$ python argparse_option_bool.py
False
<type 'bool'>
Ak chcete nastaviť predvolenú hodnotu na true a po pridaní možnosti na false, postupujte takto.action='store_false'
Použitie funkcie strtobool()
Ak chcete namiesto možností použiť pozičné argumenty, môžete použiť aj funkciu strtobool().
strtobool() je funkcia, ktorá konvertuje reťazec na true (1) alebo false (0).
Konvertuje logický reťazec na true (1) alebo false (0).
Skutočné hodnoty sú tieto
y
yes
true
on
1
Falošné hodnoty sú nasledovné.
n
no
f
false
off
0
Ak val nie je žiadna z vyššie uvedených hodnôt, vyvolá ValueError.
9. API Reference – strtobool() — Python 3.10.0 Documentation
Nerozlišuje veľké a malé písmená, takže môžete použiť napríklad nasledujúci reťazec; akýkoľvek iný reťazec spôsobí chybu.
'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'
Názov je strtobool(), ale návratová hodnota nie je bool, ale int (1 alebo 0).
print(type(strtobool('true')))
# <class 'int'>
Ako už bolo napísané, ak je v add_argument() funkcie argparse zadaný typ=xxx, argument sa odovzdá funkcii xxx(). Preto môžeme urobiť nasledovné.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))
Návratová hodnota nie je typu bool, ale typu int 1 alebo 0, ale môže čítať hodnoty true alebo false s argumentmi true alebo false.
$ python argparse_type_strtobool.py true
1
<type 'int'>
$ python argparse_type_strtobool.py false
0
<type 'int'>
Ak sa argument neočakáva, bude správne vygenerovaná chyba.
$ 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'