Ati-ati nalika nangani nilai Boolean ing argparse Python

Bisnis

Kanggo nangani argumen baris perintah ing Python, gunakake modul argv utawa argparse saka modul sys.

Modul argparse ngidini kanggo nangani fleksibel bantahan baris printah, nanging care kudu dijupuk nalika dealing with nilai Boolean (bener, palsu).

Informasi ing ngisor iki kasedhiya ing kene.

  • argparse kanggo definisi argumen sing gampang
  • Nemtokake jinis argumen (jinis) karo argparse
  • Aja nemtokake “bool” minangka jinis argumen add_argument()
  • Paukuman dening bool()
  • Gunakake tumindak argumentasi tinimbang jinis argumen.
  • Nggunakake fungsi strtobool().

argparse kanggo definisi argumen sing gampang

Modul argparse nggampangake kanggo nemtokake argumen baris perintah.

Modul argparse nggampangake nggawe antarmuka baris perintah sing ramah pangguna. Sampeyan nemtokake argumen apa sing dibutuhake program sampeyan, lan argparse bakal nemtokake cara ngurai opsi kasebut saka sys.argv. modul argparse kanthi otomatis ngasilake pesen pitulung lan panggunaan, lan nyebabake kesalahan yen pangguna nemtokake argumen sing ora bener kanggo program kasebut. kesalahan nalika pangguna nemtokake argumen sing ora bener kanggo program kasebut.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Nemtokake jinis argumen (jinis) karo argparse

Fitur migunani saka argparse yaiku kanggo nemtokake jinis (jinis).

Contone, yen sampeyan nemtokake jinis integer (int), bakal kanthi otomatis ngowahi argumen kasebut dadi int lan uga nggawe kesalahan kanggo argumen sing dudu int.

Jinis kasebut ditemtokake dening jinis argumen 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))

Jalanake file iki saka baris printah.

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

Argumen 100 diwaca minangka int.

Yen nilai non-int digunakake minangka argumen, kesalahan bakal kedadeyan.

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

Banget migunani kanggo muter bantahan sing ora dikarepke.

Aja nemtokake “bool” minangka jinis argumen add_argument()

Wigati dicathet yen bool, kaya int lan float, ora bakal bisa kaya sing dikarepake yen sampeyan nemtokake bool minangka jinis argumen 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))

Jalanake file iki saka baris printah.

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

Yen bener digunakake minangka argumen, bakal diwaca minangka jinis bool true. Iki minangka prilaku sing dikarepake, nanging masalah kasebut yaiku kasus ing ngisor iki.

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

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

Yen sampeyan nggunakake salah utawa string liyane minangka argumen, bakal diwaca minangka bener.

Alesan kenapa iki kedadeyan yaiku nalika jinis = xxx kasebut ing add_argument (), argumen kasebut diterusake menyang xxx ().

Contone, yen jinis = int, argumen bakal diterusake menyang int (); yen jinis = ngambang, banjur ngambang ().

Padha bener kanggo jinis = bool, sing tegese argumen bakal diterusake menyang bool ().

Paukuman dening bool()

Iki bool () iku angel.

Nilai ing ngisor iki dianggep palsu:

  • None
  • false
  • Zero ing jinis numerik. Contone, nilai ing ngisor iki
    • 0
    • 0
    • 0j
  • Urutan kosong. Contone
    • ()
    • []
  • Pemetaan kosong. Contone
    • {}

Kabeh nilai liyane dianggep bener – saengga obyek saka pirang-pirang jinis mesthi bener. Operasi lan fungsi sing dibangun sing ngasilake asil Boolean tansah ngasilake 0 utawa Palsu minangka nilai palsu lan 1 utawa Bener minangka nilai sing bener, kajaba kacathet.

Mulane, kabeh strings non-kosong liwati menyang bool (), apa ‘bener’ utawa ‘palsu’, bakal bali bener. Mung string kosong bakal palsu.

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

print(bool(''))
# False

Nalika jinis = bool disetel ing add_argument (), argumen kasebut diterusake menyang bool (). Mulane, minangka ditampilake ing conto ing ndhuwur, yen palsu digunakake minangka argumen, bakal diowahi dening bool () minangka string ‘Palsu’ lan diwaca minangka bener.

Gunakake tumindak argumentasi tinimbang jinis argumen.

Yen sampeyan pengin nggunakake nilai Boolean ing argparse, nemtokake ‘store_true’ utawa ‘store_false’ kanggo tumindak argumentasi.

  • store_true’
  • store_false’

Iki bakal dadi versi khusus ‘store_const’ sing bakal nyimpen Bener lan Palsu. Kajaba iku, dheweke bakal nyetel nilai standar dadi Palsu lan Bener, miturut urutan kasebut.
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))

Ing conto iki, opsi ing ngisor iki diwenehi.
--enMulane, yen en ora disetel minangka bener, bakal dimuat minangka palsu, kang Nilai standar en.

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

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

Yen sampeyan pengin nyetel standar dadi bener, lan salah nalika opsi ditambahake, mung tindakake ing ngisor iki.
action='store_false'

Nggunakake fungsi strtobool().

Yen sampeyan pengin nggunakake argumen posisi tinimbang opsi, sampeyan uga bisa nggunakake fungsi strtobool ().

strtobool () minangka fungsi sing ngowahi string dadi bener (1) utawa salah (0).

Ngonversi string boolean dadi bener (1) utawa salah (0).
Nilai sing bener kaya ing ngisor iki

  • y
  • yes
  • true
  • on
  • 1

Nilai-nilai palsu kaya ing ngisor iki.

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

Yen val ora sembarang saka ndhuwur, mundhak ValueError.

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

Iku ora cilik sensitif, contone, sampeyan bisa nggunakake ing ngisor iki; senar liyane bakal nyebabake kesalahan.

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

Jeneng iki strtobool (), nanging nilai bali ora bool, nanging int (1 utawa 0).

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

Kaya sing ditulis sadurunge, nalika jinis = xxx ditemtokake ing add_argument () saka argparse, argumen kasebut bakal dikirim menyang xxx (). Mulane, kita bisa nindakake ing ngisor iki.
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))

Nilai bali dudu jinis bool, nanging jinis int 1 utawa 0, nanging bisa maca nilai sing bener utawa salah kanthi bener utawa salah minangka argumen.

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

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

Uga, yen argumen ora dikarepake, kesalahan bakal digawe kanthi bener.

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