Python аргпарсесінде логикалық мәндермен жұмыс істегенде абай болыңыз

Іскерлік

Python бағдарламасында пәрмен жолы аргументтерін өңдеу үшін sys модулінің argv немесе argparse модульдерін пайдаланыңыз.

argparse модулі пәрмен жолы аргументтерін икемді өңдеуге мүмкіндік береді, бірақ логикалық мәндермен (шын, жалған) жұмыс істегенде абай болу керек.

Мұнда келесі ақпарат берілген.

  • аргументтерді оңай анықтау үшін argparse
  • argparse көмегімен аргумент түрін (түрін) көрсетіңіз
  • add_argument() аргумент түрі ретінде «bool» көрсетпеңіз
  • 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 ретінде оқылады.

Егер аргумент ретінде 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'

Күтпеген аргументтерді ойнау үшін өте пайдалы.

add_argument() аргумент түрі ретінде «bool» көрсетпеңіз

bool функциясын add_argument() аргумент түрі ретінде көрсетсеңіз, int және float сияқты 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))

Бұл файлды пәрмен жолынан іске қосыңыз.

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

Аргумент ретінде false немесе кез келген басқа жолды пайдалансаңыз, ол шын деп оқылады.

Мұның себебі add_argument() ішінде type=xxx көрсетілгенде, аргумент xxx() параметріне жіберіледі.

Мысалы, type=int болса, аргумент int(); type=float болса, онда float().

Дәл осылай type=bool үшін де қолданылады, яғни аргумент bool() параметріне жіберіледі.

bool() бойынша шешім

Бұл bool() қиын.

Келесі мәндер жалған болып саналады:

  • None
  • false
  • Сандық түрлерде нөл. Мысалы, келесі мәндер
    • 0
    • 0
    • 0j
  • Бос тізбек. Мысалға
    • ()
    • []
  • Бос карталау. Мысалға
    • {}

Барлық басқа мәндер ақиқат деп қабылданады – осылайша көптеген түрдегі нысандар әрқашан ақиқат болып табылады. Логикалық нәтижелерді қайтаратын амалдар мен кірістірілген функциялар, егер басқаша айтылмаса, әрқашан жалған мән ретінде 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» жолы ретінде түрлендіріліп, шын деп оқылады.

Аргумент түрінің орнына дәлел әрекетін пайдаланыңыз.

Argparse ішінде логикалық мәндерді пайдаланғыңыз келсе, аргумент әрекеті үшін «store_true» немесе «store_false» мәнін көрсетіңіз.

  • store_true’
  • store_false’

Бұл сәйкесінше True және False мәндерін сақтайтын «store_const» арнайы нұсқалары болады. Бұған қоса, олар әдепкі мәндерді сәйкесінше 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 шын ретінде орнатылмаса, ол en әдепкі мәні болып табылатын false ретінде жүктеледі.

$ 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 argparse файлының add_argument() параметрінде көрсетілгенде, аргумент 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 түрі емес, 1 немесе 0 int түрі, бірақ ол шын немесе жалған мәндерді аргументтер ретінде оқи алады.

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