Python’un argparse’sinde Boole değerleriyle uğraşırken dikkatli olun

Python’da komut satırı argümanlarını işlemek için sys modülünün argv veya argparse modüllerini kullanın.

Argparse modülü, komut satırı argümanlarının esnek bir şekilde işlenmesine izin verir, ancak Boole değerleriyle (doğru, yanlış) ilgilenirken dikkatli olunmalıdır.

Aşağıdaki bilgiler burada verilmiştir.

  • argümanların kolay tanımı için argparse
  • Argparse ile argümanın tipini (tür) belirtin
  • add_argument() argüman türü olarak “bool” belirtmeyin
  • bool() ile yargılama
  • Bağımsız değişken türü yerine bağımsız değişken eylemini kullanın.
  • strtobool() işlevini kullanma

argümanların kolay tanımı için argparse

argparse modülü, komut satırı argümanlarını tanımlamayı kolaylaştırır.

argparse modülü, kullanıcı dostu komut satırı arayüzleri oluşturmayı kolaylaştırır. Programınızın ihtiyaç duyduğu argümanları tanımlarsınız ve argparse bu seçenekleri sys.argv’den nasıl ayrıştıracağınızı çözecektir. argparse modülü otomatik olarak yardım ve kullanım mesajları oluşturur ve kullanıcı programa geçersiz argümanlar belirtirse bir hata verir. kullanıcı programa geçersiz argümanlar belirttiğinde hata.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

Argparse ile argümanın tipini (tür) belirtin

argparse’ın kullanışlı bir özelliği türü (türü) belirtmektir.

Örneğin, bir tamsayı (int) türü belirtirseniz, bağımsız değişkeni otomatik olarak int’ye dönüştürür ve ayrıca int olmayan bağımsız değişkenler için bir hata oluşturur.

Tür, add_argument() argüman türü tarafından belirtilir.

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 dosyayı komut satırından çalıştırın.

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

Argüman 100 int olarak okunur.

Argüman olarak int olmayan bir değer kullanılırsa, bir hata oluşur.

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

Beklenmeyen argümanları oynamak için çok kullanışlıdır.

add_argument() argüman türü olarak “bool” belirtmeyin

int ve float gibi bool’un, add_argument() argüman türü olarak bool belirtirseniz beklendiği gibi çalışmayacağını unutmamak önemlidir.

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 dosyayı komut satırından çalıştırın.

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

Argüman olarak true kullanılırsa, bool tipi true olarak okunur. Bu beklenen davranıştır, ancak sorun aşağıdaki durumdur.

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

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

Argüman olarak false veya başka bir dize kullanırsanız, true olarak okunur.

Bunun olmasının nedeni, add_argument() içinde type=xxx belirtildiğinde, argümanın xxx() öğesine iletilmesidir.

Örneğin, type=int ise, argüman int() öğesine iletilecektir; type=float ise, o zaman float().

Aynısı type=bool için de geçerlidir; bu, argümanın bool() öğesine iletileceği anlamına gelir.

bool() ile yargılama

Bu bool() zor bir tanesidir.

Aşağıdaki değerler yanlış kabul edilir:

  • None
  • false
  • Sayısal türlerde sıfır. Örneğin, aşağıdaki değerler
    • 0
    • 0
    • 0j
  • Boş bir sıra. Örneğin
    • ()
    • []
  • Boş haritalama. Örneğin
    • {}

Diğer tüm değerlerin doğru olduğu varsayılır – bu nedenle birçok türden nesneler her zaman doğrudur. Boolean sonuçları döndüren işlemler ve yerleşik işlevler, aksi belirtilmedikçe, yanlış değer olarak her zaman 0 veya False ve gerçek değer olarak 1 veya True döndürür.

Bu nedenle, bool()’a iletilen tüm boş olmayan dizeler, ‘true’ veya ‘false’ olsun, true değerini döndürür. Yalnızca boş dizeler false olacaktır.

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

print(bool(''))
# False

add_argument() içinde type=bool ayarlandığında, argüman bool() öğesine iletilir. Bu nedenle, yukarıdaki örnekte gösterildiği gibi, argüman olarak false kullanılırsa, bool() tarafından ‘False’ dizesi olarak dönüştürülür ve true olarak okunur.

Bağımsız değişken türü yerine bağımsız değişken eylemini kullanın.

Argparse içinde Boole değerleri kullanmak istiyorsanız, bağımsız değişken eylemi için ‘store_true’ veya ‘store_false’ belirtin.

  • store_true’
  • store_false’

Bunlar, sırasıyla True ve False’ı depolayacak olan ‘store_const’un özel sürümleri olacaktır. Ayrıca, varsayılan değerleri bu sırayla sırasıyla False ve True olarak ayarlayacaklardı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 örnekte aşağıdaki seçenekler verilmiştir.
--enBu nedenle, en true olarak ayarlanmazsa, en’nin varsayılan değeri olan false olarak yüklenir.

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

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

Seçenek eklendiğinde varsayılanı true ve false olarak ayarlamak istiyorsanız, aşağıdakileri yapmanız yeterlidir.
action='store_false'

strtobool() işlevini kullanma

Seçenekler yerine konumsal argümanlar kullanmak istiyorsanız, strtobool() işlevini de kullanabilirsiniz.

strtobool(), bir dizeyi true (1) veya false (0) değerine dönüştüren bir işlevdir.

Boolean dizesini true (1) veya false (0) değerine dönüştürür.
Gerçek değerler aşağıdaki gibidir

  • y
  • yes
  • true
  • on
  • 1

Yanlış değerler aşağıdaki gibidir.

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

val yukarıdakilerden herhangi biri değilse, ValueError değerini yükseltir.

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

Büyük/küçük harfe duyarlı değildir, bu nedenle örneğin aşağıdakileri kullanabilirsiniz; başka herhangi bir dize bir hataya neden olur.

  • 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()’dur, ancak dönüş değeri bool değil int (1 veya 0)’dır.

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

Daha önce yazıldığı gibi, argparse’ın add_argument() öğesinde type=xxx belirtildiğinde, argüman xxx() öğesine iletilecektir. Bu nedenle, aşağıdakileri yapabiliriz.
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))

Dönüş değeri bir bool tipi değil, bir int tipi 1 veya 0’dır, ancak argüman olarak true veya false ile true veya false değerlerini okuyabilir.

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

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

Ayrıca, argüman beklenmiyorsa, düzgün bir şekilde bir hata üretilecektir.

$ 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