Argparse isteğe bağlı konumsal argümanlar?


652

Bunun gibi kullanılması gereken bir komut dosyası var: usage: installer.py dir [-h] [-v]

dir şu şekilde tanımlanan konumsal bir argümandır:

parser.add_argument('dir', default=os.getcwd())

Ben diristeğe bağlı olmasını istiyorum : belirtilmediğinde sadece olmalıdır cwd.

Maalesef dirargümanı belirtmediğim zaman anladım Error: Too few arguments.

Yanıtlar:


825

Kullanın nargs='?'(veya nargs='*' birden fazla dirse ihtiyacınız olacak)

parser.add_argument('dir', nargs='?', default=os.getcwd())

genişletilmiş örnek:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

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

14
Do ?ve *onlar düzenli ifadeler (yani demek aynı anlama ?0 veya 1 ve gerektirir *0 gerektiren veya daha fazla)? Varsa, +işe yarıyor mu?
Dolan Antenucci

37
@dolan: Evet, +işe yarıyor. Ayrıntılar için docs.python.org/2/library/argparse.html#nargs adresine bakın.
Vinay Sajip

2
dir isteğe bağlı argümanlarda göstermek için bir yolu var mı? ya da konumsal argümanların bir önceki 'isteğe bağlı' niteleyiciye sahip olması gerektiği görülmektedir. (yardım söz konusu olduğunda) bu şekilde kaydolmak mümkün müdür?
scagnetti

6
@ant Yukarıdan, dir isteğe bağlıdır (argparse çıktısında köşeli parantez içinde göründüğünü gösterir).
Vinay Sajip

1
Tx! Erişim dir options.dir, değil args.dir, deniyordu gibi!
ptim

69

@VinaySajip yanıtının bir uzantısı olarak. Bahsetmeye değer ek varnargs .

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N (bir tam sayı). Komut satırından N argüman birlikte bir araya getirilecek

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'. Mevcut tüm komut satırı argümanları bir listede toplanır. Not genellikle birden fazla pozisyonel argüman olması çok mantıklı olmadığını nargs='*', ancak birden fazla isteğe bağlı argümanlar nargs='*'mümkündür.

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+'. '*' Gibi, mevcut tüm komut satırı argümanları bir liste halinde toplanır. Ayrıca, en az bir komut satırı bağımsız değişkeni yoksa bir hata iletisi oluşturulur.

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER. Kalan tüm komut satırı argümanları bir listede toplanır. Bu, diğer komut satırı yardımcı programlarına gönderilen komut satırı yardımcı programları için genellikle yararlıdır

Eğer nargsanahtar kelime argüman sağlanmaz, argüman sayısı işleme göre belirlenir tüketilen. Genel olarak bu, tek bir komut satırı bağımsız değişkeninin tüketileceği ve tek bir öğenin (liste değil) üretileceği anlamına gelir.

Düzenle (@Acumenus tarafından yapılan bir yorumdan kopyalanmıştır) nargs='?' Dokümanlar şunu söylüyor: '?'. Bir argüman mümkünse komut satırından tüketilir ve tek bir öğe olarak üretilir. Komut satırı bağımsız değişkeni yoksa, varsayılan değer değeri üretilir.


3
Bununla birlikte, nargs='?'bir liste üretmediğine dikkat edilmelidir .
Acumenus

@ABB Yanıtın son satırı Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.Umarım bu yardımcı olur ...
Matas Vaitkevicius

1
Alıntılanan çizgi, tanımlamama durumunu nargs, ancak nargs='?'tanımlamayı ifade eder. Dokümanlar ki: '?'. Bir argüman mümkünse komut satırından tüketilir ve tek bir öğe olarak üretilir. Komut satırı bağımsız değişkeni yoksa, varsayılan değer değeri üretilir.
Acumenus

@ABB Bir şeyin eksik olduğunu düşünüyorsanız cevabı düzenleyin. Teşekkürler.
Matas Vaitkevicius

Aralarındaki fark nedir nargs=argparse.REMAINDERve nargs='*'bana göre göründüğü gibi, etkileri bakımından aynıdırlar (Python 2.7.10 ve Python 3.6.1'de test edilmiştir)?

-5

parser.add_argumentayrıca bir anahtar gerekir . Kullanabilirsiniz required=False. İşte Python 2.7 ile bir örnek pasaj:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

11
OP konumsal parametreler soruyordu, '--dir' değil. 'zorunlu' konumlar için geçersiz bir argüman. Ve 'yanlış' bir yazım hatasıydı, 'Yanlış' demekti. Yeni başlayanlar için +1, özensizlik için -1.
SoloPilot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.