Ili kushughulikia hoja za mstari wa amri katika Python, tumia moduli za argv au argparse za moduli ya sys.
Moduli ya argparse inaruhusu ushughulikiaji rahisi wa hoja za mstari wa amri, lakini uangalifu lazima uchukuliwe unaposhughulika na maadili ya Boolean (kweli, uongo).
Habari ifuatayo imetolewa hapa.
- argparse kwa ufafanuzi rahisi wa hoja
- Bainisha aina ya hoja (aina) na argparse
- Usibainishe “bool” kama aina ya hoja ya add_argument()
- Hukumu kwa bool()
- Tumia kitendo cha hoja badala ya aina ya hoja.
- Kwa kutumia strtobool() kitendakazi
argparse kwa ufafanuzi rahisi wa hoja
Moduli ya argparse hurahisisha kufafanua hoja za mstari wa amri.
Moduli ya argparse hurahisisha kuunda violesura vya mstari wa amri vinavyofaa mtumiaji. Unafafanua ni hoja zipi ambazo programu yako inahitaji, na argparse itabaini jinsi ya kuchanganua chaguo hizo kutoka kwa sys.argv. moduli ya argparse hutoa kiotomatiki ujumbe wa usaidizi na matumizi, na huibua hitilafu ikiwa mtumiaji atabainisha hoja zisizo sahihi kwa programu. kosa wakati mtumiaji anabainisha hoja zisizo sahihi kwa programu.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation
Bainisha aina ya hoja (aina) na argparse
Kipengele muhimu cha argparse ni kutaja aina (aina).
Kwa mfano, ukibainisha aina kamili (int), itabadilisha kiotomati hoja kuwa int na pia italeta hitilafu kwa hoja ambazo si int.
Aina imebainishwa na aina ya hoja ya 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))
Endesha faili hii kutoka kwa mstari wa amri.
$ python argparse_type_int.py 100
100
<type 'int'>
Hoja ya 100 inasomwa kama int.
Ikiwa thamani isiyo ya inti itatumika kama hoja, hitilafu itatokea.
$ 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'
Muhimu sana kwa kucheza hoja zisizotarajiwa.
Usibainishe “bool” kama aina ya hoja ya add_argument()
Ni muhimu kutambua kuwa bool, kama int na kuelea, haitafanya kazi kama inavyotarajiwa ikiwa utabainisha bool kama aina ya hoja ya 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))
Endesha faili hii kutoka kwa mstari wa amri.
$ python argparse_type_bool.py True
True
<type 'bool'>
Ikiwa kweli inatumiwa kama hoja, itasomwa kama aina ya bool kweli. Hii ndio tabia inayotarajiwa, lakini shida ni kesi ifuatayo.
$ python argparse_type_bool.py False
True
<type 'bool'>
$ python argparse_type_bool.py bar
True
<type 'bool'>
Ukitumia uwongo au mfuatano wowote kama hoja, itasomwa kama kweli.
Sababu kwa nini hii inatokea ni kwamba wakati type=xxx imeainishwa katika add_argument(), hoja hupitishwa kwa xxx().
Kwa mfano, ikiwa type=int, hoja itapitishwa kwa int(); ikiwa type=float, basi float().
Vile vile ni kweli kwa type=bool, ambayo inamaanisha kuwa hoja itapitishwa kwa bool().
Hukumu kwa bool()
Hii bool() ni gumu.
- bool() — Built-in Functions — Python 3.10.0 Documentation
- Truth Value Testing — Built-in Types — Python 3.10.0 Documentation
Thamani zifuatazo zinachukuliwa kuwa za uwongo:
- None
- false
- Sifuri katika aina za nambari. Kwa mfano, maadili yafuatayo
- 0
- 0
- 0j
- Mlolongo tupu. Kwa mfano
- ‘
- ()
- []
- Ramani tupu. Kwa mfano
- {}
Thamani zingine zote huchukuliwa kuwa kweli – kwa hivyo vitu vya aina nyingi huwa kweli kila wakati. Uendeshaji na vitendakazi vilivyojengewa ndani ambavyo hurejesha matokeo ya Boolean kila wakati hurejesha 0 au Sivyo kama thamani ya uongo na 1 au Kweli kama thamani ya kweli, isipokuwa kama ibainishwe vinginevyo.
Kwa hivyo, mifuatano yote isiyo tupu iliyopitishwa kwa bool(), iwe ‘kweli’ au ‘sivyo’, itarudi kuwa kweli. Mifuatano tupu pekee ndiyo itakuwa ya uwongo.
print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True
print(bool(''))
# False
Wakati type=bool imewekwa katika add_argument(), hoja hupitishwa kwa bool(). Kwa hivyo, kama inavyoonyeshwa kwenye mfano hapo juu, ikiwa uwongo utatumiwa kama hoja, itabadilishwa na bool() kama kamba ‘False’ na kusomeka kama kweli.
Tumia kitendo cha hoja badala ya aina ya hoja.
Ikiwa ungependa kutumia thamani za Boolean katika argparse, bainisha ‘store_true’ au ‘store_false’ kwa hatua ya hoja.
- store_true’
- store_false’
Haya yatakuwa matoleo maalum ya ‘store_const’ ambayo yatahifadhi Kweli na Si kweli mtawalia. Kwa kuongeza, wataweka thamani chaguomsingi kuwa Sivyo na Kweli mtawalia, kwa mpangilio huo.
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))
Katika mfano huu, chaguzi zifuatazo zinatolewa.--en
Kwa hivyo, ikiwa en haijawekwa kuwa kweli, itapakiwa kama sivyo, ambayo ni thamani chaguomsingi ya en.
$ python argparse_option_bool.py --en
True
<type 'bool'>
$ python argparse_option_bool.py
False
<type 'bool'>
Ikiwa unataka kuweka chaguomsingi kuwa kweli, na sivyo chaguo linapoongezwa, fanya yafuatayo.action='store_false'
Kwa kutumia strtobool() kitendakazi
Ikiwa unataka kutumia hoja za msimamo badala ya chaguo, unaweza pia kutumia kazi strtobool().
strtobool() ni chaguo la kukokotoa ambalo hubadilisha mfuatano kuwa kweli (1) au uongo (0).
Hubadilisha mfuatano wa boolean kuwa kweli (1) au uongo (0).
Maadili ya kweli ni kama ifuatavyo
y
yes
true
on
1
Maadili ya uwongo ni kama ifuatavyo.
n
no
f
false
off
0
Ikiwa val sio yoyote ya hapo juu, inaongeza ValueError.
9. API Reference – strtobool() — Python 3.10.0 Documentation
Sio nyeti kwa kesi, kwa mfano, unaweza kutumia zifuatazo; kamba nyingine yoyote itasababisha hitilafu.
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'
Jina ni strtobool(), lakini thamani ya kurudi sio bool, lakini int (1 au 0).
print(type(strtobool('true')))
# <class 'int'>
Kama ilivyoandikwa hapo awali, wakati type=xxx imeainishwa katika add_argument() ya argparse, hoja itapitishwa kwa xxx(). Kwa hiyo, tunaweza kufanya yafuatayo.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))
Thamani ya kurudisha si aina ya bool, lakini ni aina ya 1 au 0, lakini inaweza kusoma thamani za kweli au zisizo za kweli kwa hoja za kweli au za uongo.
$ python argparse_type_strtobool.py true
1
<type 'int'>
$ python argparse_type_strtobool.py false
0
<type 'int'>
Pia, ikiwa hoja haitarajiwi, hitilafu itatolewa ipasavyo.
$ 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'