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.
- bool() — Built-in Functions — Python 3.10.0 Documentation
- Truth Value Testing — Built-in Types — Python 3.10.0 Documentation
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.--en
Bu 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'