Python argparse-də Boolean dəyərləri ilə işləyərkən diqqətli olun

Biznes

Python-da komanda xətti arqumentlərini idarə etmək üçün sys modulunun argv və ya argparse modullarından istifadə edin.

Argparse modulu əmr xətti arqumentlərinin çevik idarə edilməsinə imkan verir, lakin Boolean dəyərlərinə (doğru, yanlış) baxarkən diqqətli olmaq lazımdır.

Aşağıdakı məlumatlar burada verilir.

  • Arqumentlərin asan tərifi üçün argparse
  • Arqumentin növünü (növünü) argparse ilə təyin edin
  • add_argument() arqument növü kimi “bool” təyin etməyin
  • bool() ilə hökm
  • Arqument növü əvəzinə arqument hərəkətindən istifadə edin.
  • strtobool() funksiyasından istifadə etməklə

Arqumentlərin asan tərifi üçün argparse

Argparse modulu əmr xətti arqumentlərini təyin etməyi asanlaşdırır.

argparse modulu istifadəçi dostu komanda xətti interfeysləri yaratmağı asanlaşdırır. Siz proqramınızın hansı arqumentlərə ehtiyac duyduğunu müəyyənləşdirirsiniz və argparse sys.argv saytından bu variantları necə təhlil edəcəyinizi anlayacaq. argparse modulu avtomatik olaraq yardım və istifadə mesajları yaradır və istifadəçi proqrama etibarsız arqumentlər təyin edərsə, xəta yaradır. istifadəçi proqrama etibarsız arqumentlər təyin edərkən xəta.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Arqumentin növünü (növünü) argparse ilə təyin edin

Argparse-in faydalı xüsusiyyəti növü (növü) təyin etməkdir.

Məsələn, əgər siz tam ədəd (int) növü göstərsəniz, o, avtomatik olaraq arqumenti int-ə çevirəcək və həmçinin int olmayan arqumentlər üçün xəta yaradacaq.

Növ add_argument() arqument növü ilə müəyyən edilir.

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

Bu faylı komanda xəttindən işə salın.

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

Arqument 100 int kimi oxunur.

Arqument kimi qeyri-int dəyəri istifadə edilərsə, xəta baş verəcək.

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

Gözlənilməz mübahisələr oynamaq üçün çox faydalıdır.

add_argument() arqument növü kimi “bool” təyin etməyin

Qeyd etmək vacibdir ki, int və float kimi bool, add_argument() arqument növü kimi bool təyin etsəniz, gözlənildiyi kimi işləməyəcək.

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

Bu faylı komanda xəttindən işə salın.

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

Arqument kimi true istifadə edilərsə, o, bool tipi true kimi oxunacaq. Bu gözlənilən davranışdır, lakin problem aşağıdakı vəziyyətdədir.

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

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

Arqument kimi false və ya hər hansı digər sətirdən istifadə etsəniz, o, doğru kimi oxunacaq.

Bunun baş verməsinin səbəbi add_argument()-də type=xxx təyin edildikdə, arqumentin xxx()-a ötürülməsidir.

Məsələn, type=int olarsa, arqument int(); əgər type=float, onda float().

Eyni şey type=bool üçün də keçərlidir, yəni arqument bool()-a ötürüləcək.

bool() ilə hökm

Bu bool() mürəkkəbdir.

Aşağıdakı dəyərlər yanlış hesab olunur:

  • None
  • false
  • Rəqəm tiplərində sıfır. Məsələn, aşağıdakı dəyərlər
    • 0
    • 0
    • 0j
  • Boş ardıcıllıq. Misal üçün
    • ()
    • []
  • Boş xəritəçəkmə. Misal üçün
    • {}

Bütün digər dəyərlərin doğru olduğu qəbul edilir – beləliklə, bir çox növ obyektlər həmişə doğrudur. Boolean nəticələrini qaytaran əməliyyatlar və daxili funksiyalar, başqa cür qeyd edilmədiyi təqdirdə, həmişə 0 və ya Yanlış dəyərini yalnış dəyər kimi, 1 və ya True isə həqiqi dəyər kimi qaytarır.

Buna görə də, bool()-a ötürülən bütün boş olmayan sətirlər, istər ‘doğru’, istərsə də ‘yanlış’ olsun, doğru qaytaracaq. Yalnız boş sətirlər yalan olacaq.

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

print(bool(''))
# False

type=bool add_argument()-də təyin edildikdə, arqument bool()-a ötürülür. Buna görə də, yuxarıdakı misalda göstərildiyi kimi, arqument kimi false istifadə edilərsə, o, bool() tərəfindən ‘False’ sətri kimi çevriləcək və doğru olaraq oxunacaq.

Arqument növü əvəzinə arqument hərəkətindən istifadə edin.

Əgər siz argparse-də Boolean dəyərlərindən istifadə etmək istəyirsinizsə, arqument əməliyyatı üçün ‘store_true’ və ya ‘store_false’ təyin edin.

  • store_true’
  • store_false’

Bunlar müvafiq olaraq True və False saxlayan ‘store_const’ xüsusi versiyaları olacaq. Bundan əlavə, onlar bu ardıcıllıqla standart dəyərləri müvafiq olaraq False və True olaraq təyin edəcəklər.
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))

Bu nümunədə aşağıdakı variantlar verilmişdir.
--enBuna görə də, əgər en doğru olaraq təyin edilməmişsə, o, en-in standart dəyəri olan false kimi yüklənəcək.

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

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

Varsayılanı doğru, seçim əlavə edildikdə isə yalan olaraq təyin etmək istəyirsinizsə, aşağıdakıları edin.
action='store_false'

strtobool() funksiyasından istifadə etməklə

Seçimlər əvəzinə mövqe arqumentlərindən istifadə etmək istəyirsinizsə, strtobool() funksiyasından da istifadə edə bilərsiniz.

strtobool() sətri doğru (1) və ya yalana (0) çevirən funksiyadır.

Boolean sətri doğru (1) və ya yalana (0) çevirir.
Həqiqi dəyərlər aşağıdakı kimidir

  • y
  • yes
  • true
  • on
  • 1

Yanlış dəyərlər aşağıdakı kimidir.

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

Əgər val yuxarıda göstərilənlərdən heç biri deyilsə, bu, ValueError-u artırır.

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

Bu, hərflərə həssas deyil, buna görə də məsələn, aşağıdakılardan istifadə edə bilərsiniz; hər hansı digər sətir xəta ilə nəticələnəcək.

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

Adı strtobool(), lakin qaytarılan dəyər bool deyil, int (1 və ya 0)dır.

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

Daha əvvəl yazıldığı kimi, argparse-in add_argument()-də type=xxx təyin edildikdə, arqument xxx()-a ötürüləcək. Buna görə də aşağıdakıları edə bilərik.
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))

Qaytarılan dəyər bool növü deyil, int növü 1 və ya 0dır, lakin o, arqumentlər olaraq doğru və ya yanlış olan doğru və ya yanlış dəyərləri oxuya bilər.

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

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

Həmçinin, arqument gözlənilməzsə, səhv düzgün şəkildə yaradılacaq.

$ 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