Будите опрезни када радите са Буловим вредностима у Питхон-овом аргпарсе-у

Бусинесс

За руковање аргументима командне линије у Питхон-у, користите модуле аргв или аргпарсе модула сис.

Модул аргпарсе омогућава флексибилно руковање аргументима командне линије, али се мора водити рачуна када се ради са Буловим вредностима (тачно, нетачно).

Следеће информације су дате овде.

  • аргпарсе за лако дефинисање аргумената
  • Наведите тип аргумента (тип) помоћу аргпарсе
  • Немојте наводити „боол“ као тип аргумента адд_аргумент()
  • Пресуда по боол()
  • Користите акцију аргумента уместо типа аргумента.
  • Коришћење функције стртобоол().

аргпарсе за лако дефинисање аргумената

Модул аргпарсе олакшава дефинисање аргумената командне линије.

Модул аргпарсе олакшава креирање корисничких интерфејса командне линије. Ви дефинишете који су аргументи потребни вашем програму, а аргпарсе ће схватити како да рашчлани те опције из сис.аргв. аргпарсе модул аутоматски генерише поруке помоћи и употребе и покреће грешку ако корисник наведе неважеће аргументе програму. грешка када корисник наведе неважеће аргументе програму.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Наведите тип аргумента (тип) помоћу аргпарсе

Корисна карактеристика аргпарсе-а је да наведе тип (тип).

На пример, ако наведете целобројни (инт) тип, он ће аутоматски конвертовати аргумент у инт и такође покренути грешку за аргументе који нису инт.

Тип је специфициран типом аргумента адд_аргумент().

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 се чита као инт.

Ако се као аргумент користи вредност која није инт, доћи ће до грешке.

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

Веома корисно за играње неочекиваних аргумената.

Немојте наводити „боол“ као тип аргумента адд_аргумент()

Важно је напоменути да боол, попут инт и флоат, неће радити како се очекује ако наведете боол као тип аргумента адд_аргумент().

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

Ако се труе користи као аргумент, биће прочитан као боол тип труе. Ово је очекивано понашање, али проблем је следећи случај.

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

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

Ако користите фалсе или било који други стринг као аргумент, он ће бити прочитан као истинит.

Разлог зашто се то дешава је тај што када је типе=ккк специфициран у адд_аргумент(), аргумент се прослеђује ккк().

На пример, ако је типе=инт, аргумент ће бити прослеђен инт(); ако је типе=флоат, онда флоат().

Исто важи и за тип=боол, што значи да ће аргумент бити прослеђен боол().

Пресуда по боол()

Овај боол() је лукав.

Следеће вредности се сматрају нетачним:

  • None
  • false
  • Нула у нумеричким типовима. На пример, следеће вредности
    • 0
    • 0
    • 0j
  • Празан низ. На пример
    • ()
    • []
  • Празно мапирање. На пример
    • {}

Претпоставља се да су све остале вредности истините – стога су објекти многих типова увек истинити. Операције и уграђене функције које враћају Булове резултате увек враћају 0 или Фалсе као нетачну вредност и 1 или Тачно као тачну вредност, осим ако није другачије назначено.

Према томе, сви непразни стрингови прослеђени боол(), било да је „тачно” или „нетачно”, вратиће тачно. Само празни низови ће бити лажни.

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

print(bool(''))
# False

Када је типе=боол постављен у адд_аргумент(), аргумент се прослеђује боол(). Стога, као што је приказано у горњем примеру, ако се користи фалсе као аргумент, он ће бити конвертован помоћу боол() као стринг ‘Фалсе’ и прочитан као истинит.

Користите акцију аргумента уместо типа аргумента.

Ако желите да користите Булове вредности у аргпарсе-у, наведите ‘сторе_труе’ или ‘сторе_фалсе’ за акцију аргумента.

  • store_true’
  • store_false’

Ово ће бити посебне верзије ‘сторе_цонст’ које ће чувати тачно и нетачно. Поред тога, они ће поставити подразумеване вредности на Фалсе и Труе, респективно, тим редоследом.
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Стога, ако ен није постављен као тачан, биће учитан као нетачан, што је подразумевана вредност ен.

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

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

Ако желите да подесите подразумевану вредност на труе, а фалсе када се опција дода, само урадите следеће.
action='store_false'

Коришћење функције стртобоол().

Ако желите да користите позиционе аргументе уместо опција, можете користити и функцију стртобоол().

стртобоол() је функција која конвертује стринг у тачно (1) или нетачно (0).

Конвертује логички низ у тачно (1) или нетачно (0).
Праве вредности су следеће

  • y
  • yes
  • true
  • on
  • 1

Лажне вредности су следеће.

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

Ако вал није ништа од горе наведеног, он подиже ВалуеЕррор.

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'

Име је стртобоол(), али повратна вредност није боол, већ инт (1 или 0).

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

Као што је раније написано, када је типе=ккк специфициран у адд_аргумент() аргпарсе-а, аргумент ће бити прослеђен ккк(). Стога можемо урадити следеће.
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))

Повратна вредност није боол тип, већ инт тип 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'