Python дээр тушаалын мөрийн аргументуудыг зохицуулахын тулд sys модулийн argv эсвэл argparse модулийг ашиглана уу.
argparse модуль нь командын мөрийн аргументуудыг уян хатан зохицуулах боломжийг олгодог боловч Boolean утгуудыг (үнэн, худал) харьцахдаа болгоомжтой байх хэрэгтэй.
Энд дараах мэдээллийг хүргэж байна.
- Аргументуудыг хялбархан тодорхойлохын тулд argparse
- argparse ашиглан аргументийн төрлийг (төрөл) зааж өгнө үү
- add_argument()-ын аргументын төрөл гэж “bool”-ыг бүү зааж өг.
- bool()-ийн шүүлт
- Аргументийн төрлийн оронд аргумент үйлдлийг ашиглана уу.
- strtobool() функцийг ашиглаж байна
Аргументуудыг хялбархан тодорхойлохын тулд argparse
argparse модуль нь командын мөрийн аргументуудыг тодорхойлоход хялбар болгодог.
argparse модуль нь хэрэглэгчдэд ээлтэй командын мөрийн интерфейс үүсгэхэд хялбар болгодог. Та өөрийн программдаа ямар аргумент хэрэгтэйг тодорхойлох ба argparse эдгээр сонголтуудыг sys.argv-ээс хэрхэн задлан шинжлэхийг олох болно. argparse модуль нь тусламж болон хэрэглээний мессежийг автоматаар үүсгэдэг бөгөөд хэрэв хэрэглэгч програмд буруу аргументуудыг зааж өгвөл алдаа гаргадаг. Хэрэглэгч програмд буруу аргументуудыг зааж өгөх үед алдаа гарна.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation
argparse ашиглан аргументийн төрлийг (төрөл) зааж өгнө үү
Argparse-ийн ашигтай шинж чанар нь төрлийг (төрөл) зааж өгөх явдал юм.
Жишээлбэл, хэрэв та бүхэл тоо (int) төрлийг зааж өгвөл энэ нь аргументыг автоматаар int болгон хувиргах ба int биш аргументуудад алдаа гаргах болно.
Төрөл нь 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))
Энэ файлыг тушаалын мөрөөс ажиллуулна уу.
$ python argparse_type_int.py 100
100
<type 'int'>
100 аргументыг int гэж уншина.
Хэрэв аргумент болгон int бус утгыг ашиглавал алдаа гарна.
$ 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'
Гэнэтийн маргаан үүсгэхэд маш хэрэгтэй.
add_argument()-ын аргументын төрөл гэж “bool”-ыг бүү зааж өг.
Хэрэв та bool-г add_argument() аргументын төрлөөр зааж өгвөл int болон float гэх мэт bool нь санаснаар ажиллахгүй гэдгийг анхаарах нь чухал.
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))
Энэ файлыг тушаалын мөрөөс ажиллуулна уу.
$ python argparse_type_bool.py True
True
<type 'bool'>
Үнэнийг аргумент болгон ашиглавал bool төрлийн true гэж уншина. Энэ бол хүлээгдэж буй зан төлөв боловч асуудал нь дараах тохиолдол юм.
$ python argparse_type_bool.py False
True
<type 'bool'>
$ python argparse_type_bool.py bar
True
<type 'bool'>
Хэрэв та false эсвэл өөр ямар нэг мөрийг аргумент болгон ашиглавал үнэн гэж уншина.
Яагаад ийм зүйл болж байгаа вэ гэвэл add_argument()-д type=xxx-г заасан үед аргументыг xxx() руу дамжуулдаг.
Жишээлбэл, type=int бол аргументыг int(); Хэрэв type=float бол float().
Энэ нь type=bool-д мөн адил бөгөөд энэ нь аргументыг bool() руу дамжуулна гэсэн үг юм.
bool()-ийн шүүлт
Энэ bool() нь төвөгтэй юм.
- bool() — Built-in Functions — Python 3.10.0 Documentation
- Truth Value Testing — Built-in Types — Python 3.10.0 Documentation
Дараах утгыг худал гэж үзнэ.
- None
- false
- Тоон төрлүүдийн хувьд тэг. Жишээлбэл, дараах утгууд
- 0
- 0
- 0j
- Хоосон дараалал. Жишээлбэл
- ‘
- ()
- []
- Хоосон зураглал. Жишээлбэл
- {}
Бусад бүх утгыг үнэн гэж үздэг тул олон төрлийн объектууд үргэлж үнэн байдаг. Хэрэв өөрөөр заагаагүй бол Boolean үр дүнг буцаадаг үйлдлүүд болон суулгасан функцууд нь үргэлж 0 эсвэл Худал утгыг худал, 1 эсвэл Үнэнийг үнэн утгаар буцаана.
Тиймээс bool() руу дамжуулсан бүх хоосон биш мөрүүд ‘true’ эсвэл ‘false’ эсэхээс үл хамааран үнэнийг буцаана. Зөвхөн хоосон мөрүүд худал байх болно.
print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True
print(bool(''))
# False
type=bool-г add_argument()-д тохируулах үед аргументыг bool() руу дамжуулдаг. Иймд дээрх жишээнд үзүүлсэнчлэн хэрэв false-г аргумент болгон ашиглавал bool()-г ‘False’ мөр болгон хөрвүүлж, үнэн гэж уншина.
Аргументийн төрлийн оронд аргумент үйлдлийг ашиглана уу.
Хэрэв та argparse-д логикийн утгуудыг ашиглахыг хүсвэл аргументийн үйлдэлд ‘store_true’ эсвэл ‘store_false’-г зааж өгнө үү.
- store_true’
- store_false’
Эдгээр нь True болон False-г тус тус хадгалах ‘store_const’-ын тусгай хувилбарууд байх болно. Нэмж дурдахад тэд анхдагч утгуудыг дарааллаар нь худал, үнэн гэж тохируулна.
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))
Энэ жишээнд дараах сонголтуудыг өгсөн болно.--en
Тиймээс en-г үнэн гэж тохируулаагүй бол худал гэж ачаалагдах бөгөөд энэ нь en-ийн өгөгдмөл утга юм.
$ python argparse_option_bool.py --en
True
<type 'bool'>
$ python argparse_option_bool.py
False
<type 'bool'>
Хэрэв та тохиргоог нэмэх үед анхдагчыг үнэн, худал гэж тохируулахыг хүсвэл дараах зүйлийг хийхэд л хангалттай.action='store_false'
strtobool() функцийг ашиглаж байна
Хэрэв та сонголтын оронд байрлалын аргументуудыг ашиглахыг хүсвэл strtobool() функцийг ашиглаж болно.
strtobool() нь мөрийг үнэн (1) эсвэл худал (0) болгон хувиргадаг функц юм.
Булийн мөрийг үнэн (1) эсвэл худал (0) болгон хувиргана.
Жинхэнэ утгууд нь дараах байдалтай байна
y
yes
true
on
1
Хуурамч утгууд нь дараах байдалтай байна.
n
no
f
false
off
0
Хэрэв val нь дээрхийн аль нь ч биш бол энэ нь ValueError-ийг нэмэгдүүлдэг.
9. API Reference – strtobool() — Python 3.10.0 Documentation
Энэ нь жижиг жижиг жижиг том үсгийн мэдрэмжгүй тул жишээлбэл, та дараахийг ашиглаж болно; өөр ямар ч мөр нь алдаа гаргах болно.
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'
Нэр нь strtobool() боловч буцах утга нь bool биш харин int (1 эсвэл 0) юм.
print(type(strtobool('true')))
# <class 'int'>
Өмнө нь бичсэнчлэн argparse-ийн add_argument()-д type=xxx-г зааж өгсөн тохиолдолд аргументыг xxx() руу шилжүүлэх болно. Тиймээс бид дараахь зүйлийг хийж чадна.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))
Буцах утга нь bool төрөл биш, харин int төрлийн 1 эсвэл 0 боловч үнэн эсвэл худал утгыг аргумент болгон уншиж чаддаг.
$ python argparse_type_strtobool.py true
1
<type 'int'>
$ python argparse_type_strtobool.py false
0
<type 'int'>
Мөн хэрэв аргумент хүлээгдээгүй бол алдаа зөв үүснэ.
$ 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'