2012-06-17 26 views
14

altparser listesini kaldırın Argparse kullanarak bir komut satırı yardımcı programı yazıyorum ve bir grup alt_pardı (alt komut) ekledim. Yardım menüsünde "komutlar" adı verilen bir grup altında görünürler ve tüm olası seçeneklerin güzel bir listesini alırım. Bu liste belirir Ancak önce, hepsi aynı komutları şöyle ayraç grup başlığı altında görünür:Argparse python, yardım menüsünde

Commands: 
    {foo, bar} 

    foo   - foo does foo 
    bar   - bar does bar 

Ben parantez görünen gereksiz girdileri kaldırmak istiyorum. Alt_parserlerle dolu bu grupta görünür.

bu görünüyor işlemek için Kodum gibi pek:

subparsers = parser.add_subparsers(title="Commands") 

foo = subparsers.add_parser("foo", help="- foo does foo") 
bar = subparsers.add_parser("bar", help="- bar does bar") 

Ben nitelikler ve benim komutları eylem grubunun yöntemlerine baktım ve gibi olamaz (ayrıştırıcı ArgumentParser() örneği olduğu) Bunu benim için çözecek bir şey bul (en azından anlamlandırabileceğim şeyden). Başka birinin bununla ilgilenip ilgilenmediğinden emin değilim, muhtemelen biraz karanlık olduğunu anlıyorum. Ve yine, tek yapmaya çalıştığım, parantez içinde görünen komutların yedek listesini kaldırmanın yolunu bulmak.

cevap

11

"{foo bar}" bölümü argüman 'metavar' olduğunu bakın. Metavar, argparse'nin kullanım ve yardım dizelerinde beklenen argüman değerlerine nasıl başvurduğudur. argparse, bir argüman gibi bir argüman gibi alt komutları ele alır, böylece bir metavar belirtmezseniz, varsayılan, küme parantezindeki seçeneklerin (alt komutlar) listesidir. Kullanıcıya alt komutlar için olası seçenekleri bildirir, ancak aşağıda listelendikleri için gereksizdir ve çok sayıda alt komutunuz varsa, çirkin olur.

Kolayca kendi seçtiği metavar ile değiştirebilirsiniz:

subparsers = parser.add_subparsers(title="Commands", metavar="<command>") 
+0

Mükemmel, tam olarak ihtiyacım olan şey! Teşekkürler. –

+0

Bu başlığı tamamen kaldırmak hala imkansız. argparse boş satır bırakır. –

+1

@anatolytechtonik Aşağıdaki hackime bakın. – Naitree

3

argparse.HelpFormatter 'ün arayüzüne dayanarak ve formatter_class bağımsız değişkenini kullanarak parser yapıcısına ileterek kendi biçimlendirici sınıfınızı yazarak yardım iletisi biçimlendirmesini özelleştirebilirsiniz.

daha fazla detay http://docs.python.org/dev/library/argparse.html#formatter-class

1

dalış sonrasında gerçekten derin argparse kaynak koduna, bir yedekli {cmd1,...} seçim listesini kaldırmak için kesmek inşa ettiler.

Hack, altparse eylemi ile uğraşırken HelpFormatter'un biçimlendirme yöntemlerini değiştiren özel bir yardım biçimlendiricisi uygular. Özellikle, altbilgi argümanı grubunda subparserleri metavar ve help satırını kaldırır ve bu alt komutların ek girintilerini kaldırır.

Lütfen dikkat ederek kullanın.

python2.7 ile test python3.6

from argparse import ArgumentParser, HelpFormatter, _SubParsersAction 

class NoSubparsersMetavarFormatter(HelpFormatter): 

    def _format_action(self, action): 
     result = super()._format_action(action) 
     if isinstance(action, _SubParsersAction): 
      # fix indentation on first line 
      return "%*s%s" % (self._current_indent, "", result.lstrip()) 
     return result 

    def _format_action_invocation(self, action): 
     if isinstance(action, _SubParsersAction): 
      # remove metavar and help line 
      return "" 
     return super()._format_action_invocation(action) 

    def _iter_indented_subactions(self, action): 
     if isinstance(action, _SubParsersAction): 
      try: 
       get_subactions = action._get_subactions 
      except AttributeError: 
       pass 
      else: 
       # remove indentation 
       yield from get_subactions() 
     else: 
      yield from super()._iter_indented_subactions(action) 

parser = ArgumentParser(formatter_class=NoSubparsersMetavarFormatter) 
subparsers = parser.add_subparsers(title="Commands") 

foo = subparsers.add_parser("foo", help="- foo does foo") 
bar = subparsers.add_parser("bar", help="- bar does bar") 

parser.parse_args(['-h']) 

piton 2 versiyonu ile test piton 3 versiyonu,

from argparse import ArgumentParser, HelpFormatter, _SubParsersAction 

class NoSubparsersMetavarFormatter(HelpFormatter): 

    def _format_action(self, action): 
     result = super(NoSubparsersMetavarFormatter, 
         self)._format_action(action) 
     if isinstance(action, _SubParsersAction): 
      return "%*s%s" % (self._current_indent, "", result.lstrip()) 
     return result 

    def _format_action_invocation(self, action): 
     if isinstance(action, _SubParsersAction): 
      return "" 
     return super(NoSubparsersMetavarFormatter, 
        self)._format_action_invocation(action) 

    def _iter_indented_subactions(self, action): 
     if isinstance(action, _SubParsersAction): 
      try: 
       get_subactions = action._get_subactions 
      except AttributeError: 
       pass 
      else: 
       for subaction in get_subactions(): 
        yield subaction 
     else: 
      for subaction in super(NoSubparsersMetavarFormatter, 
            self)._iter_indented_subactions(action): 
       yield subaction 

parser = ArgumentParser(formatter_class=NoSubparsersMetavarFormatter) 
subparsers = parser.add_subparsers(title="Commands") 

foo = subparsers.add_parser("foo", help="- foo does foo") 
bar = subparsers.add_parser("bar", help="- bar does bar") 

parser.parse_args(['-h']) 

Örnek çıktı:

usage: a.py [-h] {foo,bar} ... 

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

Commands: 
    foo   - foo does foo 
    bar   - bar does bar 
+1

Bunu biraz benzer bir şekilde yaptım - http://techtonik.rainforce.org/2016/11/help-formatting-problem-with-argparse.html - ve bence arparse'nin acısı, tüm verilerini vermektir. Bir adımda ve sonra sadece çok sayıda hack çağırmak yerine bu verileri biçimlendirin. –

İlgili konular