Argparse: '--help' içine varsayılan değerler dahil etmenin yolu?


307

Aşağıdaki argparse snippet'ine sahip olduğumu varsayalım:

diags.cmdln_parser.add_argument( '--scan-time',
                     action  = 'store',
                     nargs   = '?',
                     type    = int,
                     default = 5,
                     help    = "Wait SCAN-TIME seconds between status checks.")

Şu anda şunu --helpdöndürüyor:

usage: connection_check.py [-h]
                             [--version] [--scan-time [SCAN_TIME]]

          Test the reliability/uptime of a connection.



optional arguments:
-h, --help            show this help message and exit
--version             show program's version number and exit
--scan-time [SCAN_TIME]
                    Wait SCAN-TIME seconds between status checks.

Gibi bir şey tercih ederim:

--scan-time [SCAN_TIME]
                    Wait SCAN-TIME seconds between status checks.
                    (Default = 5)

Yardım biçimlendirici koduna bakmak sınırlı seçenekler ortaya koydu. Benzer bir argparsedeğer için varsayılan değeri yazdırmanın akıllıca bir yolu var mı --scan-time, yoksa yalnızca helpbiçimlendiriciyi alt sınıfta mı kullanmalıyım?


5
Docopt ile ilgileniyor olabilirsiniz . Bir daha asla argparse'a bakmadım.
Paulo Scardine

14
@PauloScardine - Dilde yerleşik olmak argparse için büyük bir avantajdır.
jordanm

1
@PauloScardine: Standart olmayan bir kütüphaneyi mevcut projeme çekmek gerçekten acı verici olacak, ama eminim docopt çıktısının görünümü gibi. Bahşiş için teşekkürler!
JS.

@JS. "Standart olmayan bir kütüphaneyi şu anki projeme çekmek gerçekten acı verici olacak" diyorsunuz. Gerçekten mi? Pypi'de çok sayıda yararlı kütüphane var. Benim bağlamımda standart olmayan bir kitaplık çekmek kolaydır. Bağlamınızda zorsa üzücü.
guettli

3
@guettli: Bu proje ticari amaçlı bir proje içindi. Doğru kurulum kolaydı. Kurumsal hukuktan onay almak bir kabustu.
JS.

Yanıtlar:


447

argparse.ArgumentDefaultsHelpFormatterFormatlayıcıyı kullanın :

parser = argparse.ArgumentParser(
    # ... other options ...
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

Belgeleri alıntılamak için:

Kullanılabilir diğer biçimlendirici sınıfı ArgumentDefaultsHelpFormatter, bağımsız değişkenlerin her birinin varsayılan değeri hakkında bilgi ekler.

Bunun yalnızca yardım metni tanımlanmış argümanlar için geçerli olduğunu unutmayın ; Hiçbir birlikte helpbir argüman değeri, varsayılan değeri hakkında bilgi eklemek için hiçbir yardım mesajı yoktur için .

Tarama zamanı seçeneğiniz için kesin çıktı şu şekilde olur:

  --scan-time [SCAN_TIME]
                        Wait SCAN-TIME seconds between status checks.
                        (default: 5)

12
Yalnızca açık olan bağımsız değişkenlerin default=varsayılan değeri gösterip göstermediğini denetleyebilir miyim ? 'Varsayılan: Yok' metinlerini sevmediğim için.
ziyuang

14
Sen ayarlayabilirsiniz defaultiçin SUPPRESS: default=argparse.SUPPRESS. Bu durumda, bu bağımsız değişken atlanırsa ad alanı sonucuna hiçbir öznitelik eklenmeyeceğini unutmayın , defaultbelgelere bakın .
Martijn Pieters

4
Ayrıca, oluşturulan her alt parser için bunu belirtmeniz gerektiğini unutmayın.
14:59

1
Ardından sorunu gösteren minimal tekrarlanabilir bir örnek içeren yeni bir soru oluşturun . Dediğim gibi benim için Python 2.7 ile çalışıyor.
Martijn Pieters

3
@David Aynı sorunu yaşıyordum. helpArgümanı ekleyin add_argumentve işe yarayacaktır.
Pablo Díaz Ogni

190

'%(default)s'Görüntülenenleri kontrol etmek için help parametresine ekleyin .

parser.add_argument("--type", default="toto", choices=["toto","titi"],
                              help = "type (default: %(default)s)")

9
Ben zaten format_class = argparse.RawTestHelpFormatter kullanmıştı ve OOP ile etrafında osurmak gibi hissetmedim çünkü bu seçeneği seviyorum.
mqsoh

23
Biçimlendirme dizenize 'type' değişkenini eklemeyi unutmayın; örneğin, bir dize için '% (varsayılan) s' veya bir basamak için '% (varsayılan) d'.
strongMA

1
Bu çözümü çok daha iyi seviyorum, çok daha basit ve varsayılan değerleri olmayan argümanları açıkça işlemem gerekmiyor.
void.pointer

@mqsoh çoklu kalıtım aslında işe yaradı, ancak maalesef herkese açık API değil: stackoverflow.com/a/52025430/895245
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1
Biçimlendirici sınıfını değiştirmek yardım dağınıklık her yerde "(varsayılan: yok)" bir sürü ekledi çünkü bunu seviyorum.
6005

11

Sarıcı sınıfı

Bu, hem varsayılanları göstermek hem argparse.RawTextHelpFormatterde aynı anda başka bir formatlayıcı kullanmak için şimdiye kadar bulduğum en güvenilir ve KURU yaklaşımdır :

#!/usr/bin/env python3

import argparse

class ArgumentParserWithDefaults(argparse.ArgumentParser):
    def add_argument(self, *args, help=None, default=None, **kwargs):
        if help is not None:
            kwargs['help'] = help
        if default is not None and args[0] != '-h':
            kwargs['default'] = default
            if help is not None:
                kwargs['help'] += ' Default: {}'.format(default)
        super().add_argument(*args, **kwargs)

parser = ArgumentParserWithDefaults(
    formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.add_argument('--no-default', help='''my help
for no-default''')
parser.add_argument('--no-help', default=101)

parser.print_help()
print()
print(parser.parse_args())

Çıktı:

usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
               [--no-help NO_HELP]

optional arguments:
  -h, --help            show this help message and exit
  -a A                  my help
                        for a Default: 13
  -b B                  my help
                        for b Default: 42
  --no-default NO_DEFAULT
                        my help
                        for no-default
  --no-help NO_HELP

Namespace(a=13, b=42, no_default=None, no_help=101)

ArgumentDefaultsHelpFormatter+ RawTextHelpFormatterçoklu kalıtım

Birden fazla miras sadece işe yarar, ancak herkese açık API gibi görünmüyor:

#!/usr/bin/env python3

import argparse

class RawTextArgumentDefaultsHelpFormatter(
        argparse.ArgumentDefaultsHelpFormatter,
        argparse.RawTextHelpFormatter
    ):
        pass

parser = argparse.ArgumentParser(
    formatter_class=RawTextArgumentDefaultsHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.print_help()

Çıktı:

usage: a.py [-h] [-a A] [-b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A        my help
              for a (default: 13)
  -b B        my help
              for b (default: 42)

Sadece çalışır, çünkü https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 kaynaklarından önemsiz olarak gördüğümüz için :

  • RawTextHelpFormatter uygular _split_lines
  • ArgumentDefaultsHelpFormatter uygular _get_help_string

böylece birlikte iyi çalışacaklarını tahmin edebiliriz.

Ancak, bu genel API gibi görünmüyor ve ne yöntemleri formatter_class, bu yüzden şu anda bunu yapmak için genel bir API yolu olduğunu sanmıyorum. argparsedocstring diyor ki:

Bu modüldeki diğer tüm sınıflar uygulama ayrıntıları olarak kabul edilir. (Ayrıca, HelpFormatter ve RawDescriptionHelpFormatter öğelerinin yalnızca nesne adları olarak herkese açık olarak kabul edildiğini unutmayın - biçimlendirici nesnelerinin API'sı yine de bir uygulama ayrıntısı olarak kabul edilir.)

Ayrıca bkz: Argparse yardım mesajını özelleştirme

Python 3.6.5 üzerinde test edilmiştir.


1
Harika ! Sonunda hem biçimlendirilmiş doktrin Ve varsayılan argümanlar yazdırın. Teşekkürler
Sylvain
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.