Ole varovainen käsitellessäsi Boolean-arvoja Pythonin argparse-ohjelmassa.

liiketoiminta

Voit käsitellä komentoriviargumentteja Pythonissa käyttämällä sys-moduulin argv- tai argparse-moduuleja.

argparse-moduuli mahdollistaa komentoriviargumenttien joustavan käsittelyn, mutta Boolean-arvojen (true, false) käsittelyssä on oltava varovainen.

Seuraavat tiedot annetaan tässä.

  • argparse argumenttien helppoa määrittelyä varten
  • Määritä argumentin tyyppi (type) argparse-oliolla.
  • Älä määritä add_argument():n argumenttityypiksi ”bool”.
  • Tuomio bool()
  • Käytä argumenttityypin sijasta argumenttitoimintoa.
  • Käyttämällä funktiota strtobool()

argparse argumenttien helppoa määrittelyä varten

argparse-moduulin avulla komentoriviargumenttien määrittäminen on helppoa.

argparse-moduulin avulla on helppo luoda käyttäjäystävällisiä komentoriviliittymiä. Sinä määrittelet, mitä argumentteja ohjelmasi tarvitsee, ja argparse selvittää, miten nämä vaihtoehdot puretaan sys.argv:stä. argparse-moduuli luo automaattisesti ohje- ja käyttöviestit ja antaa virheilmoituksen, jos käyttäjä antaa ohjelmalle virheellisiä argumentteja. virheilmoituksen, jos käyttäjä antaa ohjelmalle virheellisiä argumentteja. virheilmoituksen, jos käyttäjä antaa ohjelmalle virheellisiä argumentteja.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Määritä argumentin tyyppi (type) argparse-oliolla.

Argparsen hyödyllinen ominaisuus on tyypin (type) määrittäminen.

Jos esimerkiksi määrität kokonaislukutyypin (int), se muuntaa argumentin automaattisesti int:ksi ja antaa virheen argumenteista, jotka eivät ole int.

Tyyppi määritetään add_argument():n argumenttityypillä.

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))

Suorita tämä tiedosto komentoriviltä.

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

Argumentti 100 luetaan muodossa int.

Jos argumenttina käytetään muuta kuin int-arvoa, tapahtuu virhe.

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

Erittäin hyödyllinen odottamattomien argumenttien esittämiseen.

Älä määritä add_argument():n argumenttityypiksi ”bool”.

On tärkeää huomata, että bool, kuten int ja float, ei toimi odotetulla tavalla, jos add_argument():n argumenttityypiksi määritetään 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))

Suorita tämä tiedosto komentoriviltä.

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

Jos argumenttina käytetään true, se luetaan bool-tyyppisenä true. Tämä on odotettu käyttäytyminen, mutta ongelma on seuraavassa tapauksessa.

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

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

Jos käytät argumenttina false- tai muuta merkkijonoa, se luetaan true-merkkinä.

Syy tähän on se, että kun type=xxx on määritetty add_argument()-kohdassa, argumentti siirretään xxx()-kohtaan.

Esimerkiksi jos type=int, argumentti välitetään funktiolle int(); jos type=float, funktiolle float().

Sama pätee tyyppiin type=bool, mikä tarkoittaa, että argumentti välitetään bool()-funktiolle.

Tuomio bool()

Tämä bool() on hankala.

Seuraavia arvoja pidetään väärinä:

  • None
  • false
  • Nolla numeerisissa tyypeissä. Esimerkiksi seuraavat arvot
    • 0
    • 0.0
    • 0j
  • Tyhjä sarja. Esimerkiksi
    • ''
    • ()
    • []
  • Tyhjä kartoitus. Esimerkiksi
    • {}

Kaikkien muiden arvojen oletetaan olevan tosi – näin ollen monien tyyppien objektit ovat aina tosi. Operaatiot ja sisäänrakennetut funktiot, jotka palauttavat Boolen tuloksia, palauttavat aina 0 tai False väärän arvon ja 1 tai True todellisen arvon, ellei toisin mainita.

Näin ollen kaikki bool()-funktioon syötetyt ei-tyhjät merkkijonot, olivatpa ne 'true' tai 'false', palauttavat true-arvon. Ainoastaan tyhjät merkkijonot ovat false.

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

print(bool(''))
# False

Kun type=bool on asetettu add_argument()-vaihtoehdossa, argumentti välitetään bool()-funktiolle. Jos argumenttina käytetään false, bool() muuntaa sen merkkijonoksi 'False' ja lukee sen true:ksi, kuten yllä olevassa esimerkissä näkyy.

Käytä argumenttityypin sijasta argumenttitoimintoa.

Jos haluat käyttää Boolean-arvoja argparse-oliossa, määritä argumenttitoiminnolle 'store_true' tai 'store_false'.

  • 'store_true'
  • 'store_false'

Nämä ovat 'store_const'-olion erikoisversioita, jotka tallentavat True- ja False-oliot. Lisäksi ne asettavat oletusarvot False ja True tässä järjestyksessä.
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))

Tässä esimerkissä annetaan seuraavat vaihtoehdot.
--enNäin ollen, jos en ei ole asetettu true-arvoksi, se ladataan false-arvona, joka on en:n oletusarvo.

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

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

Jos haluat asettaa oletusarvoksi true ja false, kun vaihtoehto lisätään, toimi seuraavasti.
action='store_false'

Käyttämällä funktiota strtobool()

Jos haluat käyttää paikannusargumentteja vaihtoehtojen sijasta, voit käyttää myös funktiota strtobool().

strtobool() on funktio, joka muuntaa merkkijonon todeksi (1) tai vääräksi (0).

Muuntaa boolean-merkkijonon todeksi (1) tai vääräksi (0).
Todelliset arvot ovat seuraavat

  • y
  • yes
  • true
  • on
  • 1

Väärät arvot ovat seuraavat.

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

Jos val ei ole mikään edellä mainituista, se aiheuttaa ValueError-virheen.

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

Siinä ei oteta huomioon isoja ja pieniä kirjaimia, joten voit käyttää esimerkiksi seuraavaa; mikä tahansa muu merkkijono aiheuttaa virheen.

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

Nimi on strtobool(), mutta paluuarvo ei ole bool vaan int (1 tai 0).

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

Kuten aiemmin on kirjoitettu, kun type=xxx on määritetty argparsen add_argument()-kohdassa, argumentti siirretään xxx()-funktioon. Voimme siis toimia seuraavasti.
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))

Paluuarvo ei ole bool-tyyppi, vaan int-tyyppi 1 tai 0, mutta se voi lukea true- tai false-arvoja, kun argumentteina on true tai false.

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

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

Jos argumenttia ei odoteta, virheilmoitus annetaan asianmukaisesti.

$ 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