សូមប្រយ័ត្នពេលដោះស្រាយជាមួយតម្លៃ Boolean ក្នុង argparse របស់ Python

អាជីវកម្ម

ដើម្បីដោះស្រាយអាគុយម៉ង់បន្ទាត់ពាក្យបញ្ជានៅក្នុង Python សូមប្រើម៉ូឌុល argv ឬ argparse នៃម៉ូឌុល sys ។

ម៉ូឌុល argparse អនុញ្ញាតឱ្យមានការគ្រប់គ្រងដែលអាចបត់បែនបាននៃអាគុយម៉ង់បន្ទាត់ពាក្យបញ្ជា ប៉ុន្តែត្រូវយកចិត្តទុកដាក់នៅពេលដោះស្រាយជាមួយតម្លៃប៊ូលីន (ពិត មិនពិត)។

ព័ត៌មានខាងក្រោមត្រូវបានផ្តល់ជូននៅទីនេះ។

  • argparse សម្រាប់និយមន័យងាយស្រួលនៃអាគុយម៉ង់
  • បញ្ជាក់ប្រភេទនៃអាគុយម៉ង់ (ប្រភេទ) ជាមួយ argparse
  • កុំបញ្ជាក់ “bool” ជាប្រភេទអាគុយម៉ង់នៃ add_argument()
  • ការវិនិច្ឆ័យដោយ 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 ។

ប្រសិនបើតម្លៃ non-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'

មានប្រយោជន៍ខ្លាំងណាស់សម្រាប់ការលេងអាគុយម៉ង់ដែលមិនរំពឹងទុក។

កុំបញ្ជាក់ “bool” ជាប្រភេទអាគុយម៉ង់នៃ add_argument()

វាជាការសំខាន់ក្នុងការកត់សម្គាល់ថា bool ដូចជា int និង float នឹងមិនដំណើរការដូចការរំពឹងទុកទេ ប្រសិនបើអ្នកបញ្ជាក់ bool ជាប្រភេទអាគុយម៉ង់នៃ 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))

ដំណើរការឯកសារនេះពីបន្ទាត់ពាក្យបញ្ជា។

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

ប្រសិនបើ true ត្រូវបានប្រើជាអាគុយម៉ង់ វានឹងត្រូវបានអានជាប្រភេទ bool true ។ នេះគឺជាអាកប្បកិរិយាដែលរំពឹងទុក ប៉ុន្តែបញ្ហាគឺករណីខាងក្រោម។

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

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

ប្រសិនបើអ្នកប្រើមិនពិត ឬខ្សែអក្សរផ្សេងទៀតជាអាគុយម៉ង់ វានឹងត្រូវបានអានថាពិត។

មូលហេតុដែលវាកើតឡើងគឺថានៅពេលដែល type=xxx ត្រូវបានបញ្ជាក់នៅក្នុង add_argument() អាគុយម៉ង់ត្រូវបានបញ្ជូនទៅ xxx()។

ឧទាហរណ៍ ប្រសិនបើ type=int អាគុយម៉ង់នឹងត្រូវបានបញ្ជូនទៅ int(); ប្រសិនបើ type=float បន្ទាប់មក float()។

ដូចគ្នាដែរចំពោះ type=bool ដែលមានន័យថាអាគុយម៉ង់នឹងត្រូវបានបញ្ជូនទៅ bool()។

ការវិនិច្ឆ័យដោយ bool ()

bool() នេះ​គឺ​ជា​ល្បិច​មួយ។

តម្លៃខាងក្រោមត្រូវបានចាត់ទុកថាមិនពិត៖

  • None
  • false
  • សូន្យនៅក្នុងប្រភេទលេខ។ ឧទាហរណ៍តម្លៃខាងក្រោម
    • 0
    • 0
    • 0j
  • លំដាប់ទទេ។ ឧទាហរណ៍
    • ()
    • []
  • ផែនទីទទេ។ ឧទាហរណ៍
    • {}

តម្លៃផ្សេងទៀតទាំងអស់ត្រូវបានសន្មតថាជាការពិត – ដូច្នេះវត្ថុនៃប្រភេទជាច្រើនតែងតែពិត។ ប្រតិបត្តិការ និងមុខងារដែលភ្ជាប់មកជាមួយដែលត្រឡប់លទ្ធផល Boolean តែងតែត្រឡប់ 0 ឬ False ជាតម្លៃមិនពិត និង 1 ឬ True ជាតម្លៃពិត លើកលែងតែមានការកត់សម្គាល់ផ្សេងទៀត។

ដូច្នេះ ខ្សែអក្សរដែលមិនទទេទាំងអស់បានបញ្ជូនទៅ bool() មិនថា ‘ពិត’ ឬ ‘មិនពិត’ នឹងត្រឡប់ពិត។ មានតែខ្សែអក្សរទទេប៉ុណ្ណោះដែលនឹងមិនពិត។

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

print(bool(''))
# False

នៅពេល type=bool ត្រូវបានកំណត់ក្នុង add_argument() អាគុយម៉ង់ត្រូវបានបញ្ជូនទៅ bool()។ ដូច្នេះ ដូចដែលបានបង្ហាញក្នុងឧទាហរណ៍ខាងលើ ប្រសិនបើ false ត្រូវបានប្រើជាអាគុយម៉ង់ វានឹងត្រូវបានបំប្លែងដោយ bool() ជាខ្សែអក្សរ ‘False’ ហើយអានថាពិត។

ប្រើសកម្មភាពអាគុយម៉ង់ជំនួសឱ្យប្រភេទអាគុយម៉ង់។

ប្រសិនបើអ្នកចង់ប្រើតម្លៃ Boolean ក្នុង argparse បញ្ជាក់ ‘store_true’ ឬ ‘store_false’ សម្រាប់សកម្មភាពអាគុយម៉ង់។

  • store_true’
  • store_false’

ទាំងនេះនឹងក្លាយជាកំណែពិសេសនៃ ‘store_const’ ដែលនឹងរក្សាទុក True និង False រៀងគ្នា។ លើសពីនេះទៀត ពួកគេនឹងកំណត់តម្លៃលំនាំដើមទៅជា False និង True រៀងៗខ្លួនតាមលំដាប់នោះ។
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 មិនត្រូវបានកំណត់ជា true នោះវានឹងត្រូវបានផ្ទុកជា false ដែលជាតម្លៃលំនាំដើមរបស់ 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'>

ដូចដែលបានសរសេរមុននេះ នៅពេលដែល type=xxx ត្រូវបានបញ្ជាក់នៅក្នុង add_argument() នៃ argparse អាគុយម៉ង់នឹងត្រូវបានបញ្ជូនទៅ 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 ប៉ុន្តែវាអាចអានតម្លៃពិត ឬមិនពិតជាមួយនឹង true ឬ false ជាអាគុយម៉ង់។

$ 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'
Copied title and URL