2016-03-29 16 views
0
gerektiren i bir görev şaşırıp

ya 2'ye pozisyonel args veya 1 (bir dosya) ile iki pozisyon argümanlar bayrak etkinse: kullanın ya bir bayrak argüman veya argparse

parser.add_argument('pos_arg1', help='desc') 
parser.add_argument('pos_arg2', help='desc') 
parser.add_argument('--add_arg1', help='desc', type=argparse.FileType('r'), nargs='?') 

yüzden senaryoyu ile kullandığınız script.py arg1 arg2 veya script.py --add_arg1 file her ikisi de geçerlidir. Bunu nasıl yapardım?

cevap

0

Eğer tanımlarsanız: Bununla

In [422]: parser=argparse.ArgumentParser()  
In [423]: g=parser.add_mutually_exclusive_group() 
In [424]: g.add_argument('--foo') 
In [426]: g.add_argument('bar',nargs='*',default='test') 

In [427]: parser.print_help() 
usage: ipython2.7 [-h] [--foo FOO | bar [bar ...]] 

positional arguments: 
    bar 

optional arguments: 
    -h, --help show this help message and exit 
    --foo FOO 

In [429]: parser.parse_args([]) 
Out[429]: Namespace(bar='test', foo=None) 

In [430]: parser.parse_args(['one','two']) 
Out[430]: Namespace(bar=['one', 'two'], foo=None) 

In [431]: parser.parse_args(['--foo','two']) 
Out[431]: Namespace(bar='test', foo='two') 

Eğer etiketsiz değerlerin iki (gerçekten herhangi bir sayıda) veya --foo ile işaretlenmiş bir değer belirtebilirsiniz. İkisini de denersem itiraz eder. Grubu required olarak işaretleyebilirdim.

birkaç not: Ben default ve const hem belirtmedikçe

nargs='?' olarak --foo İşaretleme nispeten anlamsızdır.

Yalnızca özel grupta bir konum belirtebilirim ve bu argümanın '?' Olması gerekir. veya '*' ve bir 'varsayılan'. Başka bir deyişle, gerçekten isteğe bağlı olmalı.

Mutually_exclusive_group olmadan, her iki konum için de ? yapabilirim, ancak 'sıfır veya iki argüman' diyemiyorum.

+0

Yani, çözüm yok mu? –

+0

2 konum veya bir bayraklı argümanı kabul etmek için, ancak ikisini birden değil? Çözüm, ayrıştırıcının her ikisini de kabul etmesine izin vermek ve daha sonra şikayet etmek için kendi kodunuzu yazmaktır. – hpaulj

İlgili konular