Mag-ingat kapag nakikitungo sa mga halaga ng Boolean sa argparse ng Python

Negosyo

Upang mahawakan ang mga argumento ng command line sa Python, gamitin ang argv o argparse modules ng sys module.

Ang argparse module ay nagbibigay-daan para sa flexible na pangangasiwa ng mga argumento ng command line, ngunit kailangang mag-ingat kapag nakikitungo sa mga halaga ng Boolean (true, false).

Ang sumusunod na impormasyon ay ibinigay dito.

  • argparse para sa madaling kahulugan ng mga argumento
  • Tukuyin ang uri ng argumento (uri) na may argparse
  • Huwag tukuyin ang “bool” bilang uri ng argumento ng add_argument()
  • Paghatol sa pamamagitan ng bool()
  • Gamitin ang pagkilos ng argumento sa halip na ang uri ng argumento.
  • Gamit ang strtobool() function

argparse para sa madaling kahulugan ng mga argumento

Pinapadali ng argparse module na tukuyin ang mga argumento ng command line.

Pinapadali ng argparse module na lumikha ng mga interface ng command line na madaling gamitin. Tinutukoy mo kung anong mga argumento ang kailangan ng iyong program, at malalaman ng argparse kung paano i-parse ang mga opsyong iyon mula sa sys.argv. Ang argparse module ay awtomatikong bumubuo ng mga mensahe ng tulong at paggamit, at nagtataas ng error kung ang user ay tumutukoy ng mga di-wastong argumento sa program. error kapag tinukoy ng user ang mga di-wastong argumento sa program.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Tukuyin ang uri ng argumento (uri) na may argparse

Ang isang kapaki-pakinabang na tampok ng argparse ay upang tukuyin ang uri (uri).

Halimbawa, kung tumukoy ka ng uri ng integer (int), awtomatiko nitong iko-convert ang argumento sa int at magdaragdag din ng error para sa mga argumento na hindi int.

Ang uri ay tinukoy ng uri ng argumento ng 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))

Patakbuhin ang file na ito mula sa command line.

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

Ang argumento 100 ay binabasa bilang int.

Kung ang isang hindi-int na halaga ay ginamit bilang isang argumento, isang error ang magaganap.

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

Napaka-kapaki-pakinabang para sa paglalaro ng mga hindi inaasahang argumento.

Huwag tukuyin ang “bool” bilang uri ng argumento ng add_argument()

Mahalagang tandaan na ang bool, tulad ng int at float, ay hindi gagana gaya ng inaasahan kung tinukoy mo ang bool bilang uri ng argumento ng 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))

Patakbuhin ang file na ito mula sa command line.

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

Kung true ang ginamit bilang argumento, ito ay mababasa bilang bool type true. Ito ang inaasahang pag-uugali, ngunit ang problema ay ang sumusunod na kaso.

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

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

Kung gumamit ka ng false o anumang iba pang string bilang argumento, mababasa ito bilang totoo.

Ang dahilan kung bakit ito nangyayari ay kapag ang type=xxx ay tinukoy sa add_argument(), ang argumento ay ipinapasa sa xxx().

Halimbawa, kung type=int, ang argumento ay ipapasa sa int(); kung type=float, pagkatapos ay float().

Ang parehong ay totoo para sa type=bool, na nangangahulugan na ang argumento ay ipapasa sa bool().

Paghatol sa pamamagitan ng bool()

Ang bool() na ito ay isang nakakalito.

Ang mga sumusunod na halaga ay itinuturing na mali:

  • None
  • false
  • Zero sa mga uri ng numero. Halimbawa, ang mga sumusunod na halaga
    • 0
    • 0
    • 0j
  • Isang walang laman na pagkakasunod-sunod. Halimbawa
    • ()
    • []
  • Walang laman na pagmamapa. Halimbawa
    • {}

Ang lahat ng iba pang mga halaga ay ipinapalagay na totoo – kaya ang mga bagay ng maraming uri ay palaging totoo. Ang mga operasyon at built-in na function na nagbabalik ng mga resulta ng Boolean ay palaging nagbabalik ng 0 o False bilang false value at 1 o True bilang true value, maliban kung iba ang nabanggit.

Samakatuwid, ang lahat ng hindi walang laman na string na ipinasa sa bool(), ‘true’ man o ‘false’, ay magbabalik ng true. Ang mga walang laman na string lang ang magiging false.

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

print(bool(''))
# False

Kapag ang type=bool ay nakatakda sa add_argument(), ang argumento ay ipinapasa sa bool(). Samakatuwid, tulad ng ipinapakita sa halimbawa sa itaas, kung false ang ginamit bilang argumento, ito ay mako-convert ng bool() bilang string na ‘False’ at babasahin bilang true.

Gamitin ang pagkilos ng argumento sa halip na ang uri ng argumento.

Kung gusto mong gumamit ng mga halaga ng Boolean sa argparse, tukuyin ang ‘store_true’ o ‘store_false’ para sa pagkilos ng argumento.

  • store_true’
  • store_false’

Ito ay magiging mga espesyal na bersyon ng ‘store_const’ na mag-iimbak ng True at False ayon sa pagkakabanggit. Bilang karagdagan, itatakda nila ang mga default na halaga sa False at True ayon sa pagkakasunod-sunod, sa pagkakasunud-sunod na iyon.
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))

Sa halimbawang ito, ibinibigay ang mga sumusunod na opsyon.
--enSamakatuwid, kung hindi itinakda ang en bilang true, ilo-load ito bilang false, na siyang default na halaga ng en.

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

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

Kung gusto mong itakda ang default sa true, at false kapag idinagdag ang opsyon, gawin lang ang sumusunod.
action='store_false'

Gamit ang strtobool() function

Kung gusto mong gumamit ng mga positional na argumento sa halip na mga opsyon, maaari mo ring gamitin ang function na strtobool().

Ang strtobool() ay isang function na nagko-convert ng string sa true (1) o false (0).

Kino-convert ang isang boolean string sa true (1) o false (0).
Ang mga tunay na halaga ay ang mga sumusunod

  • y
  • yes
  • true
  • on
  • 1

Ang mga maling halaga ay ang mga sumusunod.

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

Kung ang val ay hindi alinman sa itaas, pinapataas nito ang ValueError.

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

Ito ay hindi case sensitive, kaya halimbawa, maaari mong gamitin ang sumusunod; anumang iba pang string ay magreresulta sa isang error.

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

Ang pangalan ay strtobool(), ngunit ang return value ay hindi bool, ngunit int (1 o 0).

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

Gaya ng isinulat kanina, kapag ang type=xxx ay tinukoy sa add_argument() ng argparse, ang argumento ay ipapasa sa xxx(). Samakatuwid, maaari nating gawin ang mga sumusunod.
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))

Ang return value ay hindi isang bool type, ngunit isang int type 1 o 0, ngunit maaari itong magbasa ng true o false value na may true o false bilang mga argumento.

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

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

Gayundin, kung ang argumento ay hindi inaasahan, ang isang error ay bubuo ng maayos.

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