Bu sorunun halihazırda yüksek oy alan pek çok yanıtı ve kabul edilmiş bir yanıtı vardı, ancak şimdiye kadar hepsinin dikkati boole sorununu ifade etmenin çeşitli yollarıyla dağıldı ve önemli bir noktayı kaçırdı:
Sıfır veya üç komut satırı argümanı alabilen bir python betiğim var. (Ya varsayılan davranışta çalışır ya da belirtilen üç değerin tümüne ihtiyaç duyar)
Bu mantık ilk etapta kodunuzun sorumluluğu olmamalı,argparse
modültarafından ele alınmalıdır. Karmaşık bir if ifadesi yazmakla uğraşmayın, bunun yerine argüman ayrıştırıcınızı şuna benzer bir şekilde kurmayı tercih edin:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
Ve evet, konumsal bir argüman değil bir seçenek olmalı , çünkü sonuçta isteğe bağlı .
düzenlenmiş: Yorumlarda LarsH'nin endişesini gidermek için, 3 veya 0 konumsal bağımsız değişkenli arayüzü istediğinizden eminseniz bunu nasıl yazabileceğinize dair bir örnek aşağıda verilmiştir. Önceki arayüzün daha iyi bir tarz olduğukanısındayım, çünkü isteğe bağlı argümanlar seçenekler olmalıdır, ancak işte bütünlük adına alternatif bir yaklaşım. usage
Ayrıştırıcınızı oluştururkengeçersiz kılan kwarg'a dikkatedin, çünküargparse
aksi takdirde otomatik olarak yanıltıcı bir kullanım mesajı oluşturacaktır!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
İşte bazı kullanım örnekleri:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments