Při práci s logickými hodnotami v argparse jazyka Python buďte opatrní.

Podnikání

Pro zpracování argumentů příkazového řádku v jazyce Python použijte moduly argv nebo argparse modulu sys.

Modul argparse umožňuje flexibilní práci s argumenty příkazového řádku, ale je třeba dávat pozor při práci s logickými hodnotami (true, false).

Zde jsou uvedeny následující informace.

  • argparse pro snadnou definici argumentů
  • Zadání typu argumentu (type) pomocí argparse
  • Nezadávejte „bool“ jako typ argumentu funkce add_argument()
  • Výrok podle bool()
  • Místo typu argumentu použijte akci argumentu.
  • Použití funkce strtobool()

argparse pro snadnou definici argumentů

Modul argparse usnadňuje definování argumentů příkazového řádku.

Modul argparse usnadňuje vytváření uživatelsky přívětivých rozhraní příkazového řádku. Definujete, jaké argumenty váš program potřebuje, a modul argparse zjistí, jak tyto volby analyzovat ze souboru sys.argv. modul argparse automaticky generuje nápovědu a zprávy o použití a vyvolá chybu, pokud uživatel zadá programu neplatné argumenty. chybu, pokud uživatel zadá programu neplatné argumenty.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Zadání typu argumentu (type) pomocí argparse

Užitečnou funkcí argparse je zadání typu (type).

Pokud například zadáte typ integer (int), bude argument automaticky převeden na int a v případě argumentů, které nejsou typu int, dojde k chybě.

Typ je určen typem argumentu funkce 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))

Spusťte tento soubor z příkazového řádku.

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

Argument 100 se čte jako int.

Pokud je jako argument použita jiná než intová hodnota, dojde k chybě.

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

Velmi užitečné pro přehrávání neočekávaných argumentů.

Nezadávejte „bool“ jako typ argumentu funkce add_argument()

Je důležité si uvědomit, že bool, stejně jako int a float, nebude fungovat podle očekávání, pokud zadáte bool jako typ argumentu funkce 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))

Spusťte tento soubor z příkazového řádku.

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

Pokud je jako argument použito true, bude načteno jako bool typu true. To je očekávané chování, ale problémem je následující případ.

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

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

Pokud jako argument použijete false nebo jiný řetězec, bude přečten jako true.

K tomu dochází proto, že pokud je v příkazu add_argument() zadáno type=xxx, je argument předán příkazu xxx().

Například pokud type=int, bude argument předán funkci int(); pokud type=float, pak funkci float().

Totéž platí pro type=bool, což znamená, že argument bude předán funkci bool().

Výrok podle bool()

Tato funkce bool() je záludná.

Následující hodnoty jsou považovány za nepravdivé:

  • None
  • false
  • Nula v číselných typech. Například následující hodnoty
    • 0
    • 0.0
    • 0j
  • Prázdná sekvence. Například
    • ''
    • ()
    • []
  • Prázdné mapování. Například
    • {}

U všech ostatních hodnot se předpokládá, že jsou pravdivé – tedy objekty mnoha typů jsou vždy pravdivé. Operace a vestavěné funkce, které vracejí logické výsledky, vracejí vždy 0 nebo False jako nepravdivou hodnotu a 1 nebo True jako pravdivou hodnotu, pokud není uvedeno jinak.

Proto všechny neprázdné řetězce předané funkci bool(), ať už 'true' nebo 'false', vrátí true. Pouze prázdné řetězce budou false.

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

print(bool(''))
# False

Pokud je v příkazu add_argument() nastaveno type=bool, je argument předán příkazu bool(). Proto, jak je uvedeno v příkladu výše, pokud je jako argument použito false, bude převedeno funkcí bool() jako řetězec 'False' a načteno jako true.

Místo typu argumentu použijte akci argumentu.

Pokud chcete v argparse používat logické hodnoty, zadejte pro akci argumentu 'store_true' nebo 'store_false'.

  • 'store_true'
  • 'store_false'

Jedná se o speciální verze příkazu 'store_const', které budou ukládat hodnoty True a False. Kromě toho nastaví výchozí hodnoty na False a True v tomto pořadí.
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 příkladu jsou uvedeny následující možnosti.
--enPokud tedy en není nastaveno jako true, bude načteno jako false, což je výchozí hodnota en.

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

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

Pokud chcete nastavit výchozí hodnotu na true a po přidání možnosti na false, postupujte následovně.
action='store_false'

Použití funkce strtobool()

Pokud chcete místo voleb použít poziční argumenty, můžete také použít funkci strtobool().

strtobool() je funkce, která převede řetězec na hodnotu true (1) nebo false (0).

Převede logický řetězec na hodnotu true (1) nebo false (0).
Skutečné hodnoty jsou následující

  • y
  • yes
  • true
  • on
  • 1

Nepravdivé hodnoty jsou následující.

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

Pokud hodnota val není žádná z výše uvedených hodnot, vyvolá chybu ValueError.

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

Nerozlišuje velká a malá písmena, takže můžete použít například následující řetězec; jakýkoli jiný řetězec způ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ázev je strtobool(), ale návratová hodnota není bool, ale int (1 nebo 0).

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

Jak již bylo napsáno dříve, pokud je v add_argument() funkce argparse zadáno type=xxx, bude argument předán funkci xxx(). Proto můžeme postupovat následovně.
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 není typu bool, ale typu int 1 nebo 0, ale může číst hodnoty true nebo false s argumenty true nebo false.

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

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

Pokud argument není očekáván, bude také správně vygenerována 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'
Copied title and URL