2016-03-07 33 views
15

Sorunumu göstermek için aşağıdaki örnek kodu yazdım.Argparse yardım iletisini özelleştirme

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-v', '--version', action='version', 
        version='%(prog)s 1.0') 
parser.parse_args() 

Bu, aşağıdaki yardım iletisini üretir.

$ python foo.py --help 
usage: foo.py [-h] [-v] 

optional arguments: 
    -h, --help  show this help message and exit 
    -v, --version show program's version number and exit 

Her şeyin kalıpları ve tümceleri istifade eder, öyle ki bu yardım çıktı özelleştirmek istiyor ve cümle sonrası dönemi geçirir. Başka bir deyişle, yardım mesajının bu şekilde üretilmesini istiyorum.

$ python foo.py --help 
Usage: foo.py [-h] [-v] 

Optional arguments: 
    -h, --help  Show this help message and exit. 
    -v, --version Show program's version number and exit. 

Ben argparse API kullanarak kontrol edebilirsiniz şey mi. Öyleyse nasıl? Bunun nasıl yapılabileceğini gösteren küçük bir örnek verebilir misiniz?

+0

(sen [ 'help'] ayarı çalıştı mı özel argüman gruplarıyla https://docs.python.org/3/library/argparse.html# olduğunu yardım et)? – jonrsharpe

+0

Oh, anlıyorum - o zaman 'add_help 'öğesini' False' olarak ayarlayabilir ve manuel olarak yapabilirsiniz. Ancak küçük olan bu şeylerin konvansiyonudur. – jonrsharpe

cevap

14

Her şeyden önce: bu ifadeler kongre karşısında uçar ve argparse bu dizeleri kolayca değiştirmenize yardımcı olacak gerçekten bir araç değildir. Burada üç farklı dizgi diziniz var: yardım formatındaki metnin metni, bölüm başlıkları ve her bir seçenek için yardım metni. Bütün bu dizeler lokalleştirilebilir; , gettext() module support aracılığıyla tüm bu dizeler için 'büyük harfli' bir çeviri sağlayabilir. Yeterince karar verdiyseniz ve read the source code a little varsa, bu dizelere ulaşabilir ve bunları değiştirebilirsiniz.

version eylemi, varsayılan help metni içerir, ancak help bağımsız değişkenini ayarlayarak kendiniz tedarik edebilirsiniz. Aynı durum help eylemi için de geçerlidir; Eğer add_help argument ayarlarsanız el bu eylemi ekleyebilirsiniz False için:

parser = argparse.ArgumentParser(add_help=False) 

parser.add_argument('-v', '--version', action='version', 
        version='%(prog)s 1.0', help="Show program's version number and exit.") 
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, 
        help='Show this help message and exit.') 

İleri, optional arguments mesajı bir grup başlığı olduğu; her ayrıştırıcının, biri konumsal argümanlar için, diğeri isteğe bağlı olmak üzere iki varsayılan grubu vardır. ,

parser._positionals.title = 'Positional arguments' 
parser._optionals.title = 'Optional arguments' 

Eğer modülün belgesiz özel API cesaretini olan bir alt çizgi ile başlayan erişen adlarıyla, uyardı: Bir title niteliği Her ikisinin de niteliklerini _positionals ve _optionals, bu ulaşabilir ve kodunuz gelecekteki güncellemelerde kırılabilir.

Son olarak, usage dizesini değiştirmek için, yardım biçimlendiricisini alt sınıflamanız gerekir; Hep birlikte bu koyarak,

class CapitalisedHelpFormatter(argparse.HelpFormatter): 
    def add_usage(self, usage, actions, groups, prefix=None): 
     if prefix is None: 
      prefix = 'Usage: ' 
     return super(CapitalisedHelpFormatter, self).add_usage(
      usage, actions, groups, prefix) 

parser = argparse.ArgumentParser(formatter_class=CapitalisedHelpFormatter) 

Demo: formatter_class argument olarak alt sınıf geçmesine

>>> import argparse 
>>> class CapitalisedHelpFormatter(argparse.HelpFormatter): 
...  def add_usage(self, usage, actions, groups, prefix=None): 
...   if prefix is None: 
...    prefix = 'Usage: ' 
...   return super(CapitalisedHelpFormatter, self).add_usage(
...    usage, actions, groups, prefix) 
... 
>>> parser = argparse.ArgumentParser(add_help=False, formatter_class=CapitalisedHelpFormatter) 
>>> parser._positionals.title = 'Positional arguments' 
>>> parser._optionals.title = 'Optional arguments' 
>>> parser.add_argument('-v', '--version', action='version', 
...      version='%(prog)s 1.0', help="Show program's version number and exit.") 
_VersionAction(option_strings=['-v', '--version'], dest='version', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help="Show program's version number and exit.", metavar=None) 
>>> parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, 
...      help='Show this help message and exit.') 
_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='Show this help message and exit.', metavar=None) 
>>> print(parser.format_help()) 
Usage: [-v] [-h] 

Optional arguments: 
    -v, --version Show program's version number and exit. 
    -h, --help  Show this help message and exit. 
+0

Bu, tüm küçük harflerde hala "use:" ve "isteğe bağlı argümanlar:" ı yazdırır. Her şeyi nasıl sermayeleştirebilirim? –

+3

@LoneLearner: Bu noktada, buna değip değmediğini kendinize sormalısınız; Bu değerler kod tabanındaki başka yerlerde kodlanmıştır. Bir şey yapılabiliyorsa bir bakacağım, ama muhtemelen bunun sınırları var. –

2

Martijn aklıma geldi düzeltmeler bir çift vermek var - help parametreyi sağlayan ve özel Formatter sınıfı.

Başka bir kısmi düzeltme, argüman oluşturulduktan sonra yardım dizesini değiştirmek. add_argument, parametreleri ve varsayılanları içeren bir Action nesnesi oluşturur ve döndürür. Buna bir bağlantı kaydedebilir ve Action'u değiştirebilirsiniz. Ayrıca, bu eylemlerin bir listesini alabilir ve bunun üzerinde hareket edebilirsiniz.

beni varsayılan yardım ve diğer bir argüman ile basit ayrıştırıcı için, açıklayalım, aksiyon listesi:

In [1064]: parser._actions 
Out[1064]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), 
_StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)] 

ben görüntüleyebilir ve bunlardan herhangi birinin help niteliğini değiştirebilirsiniz:

In [1065]: parser._actions[0].help 
Out[1065]: 'show this help message and exit' 
In [1066]: parser._actions[0].help='Show this help message and exit.' 
kullanma

In [1067]: parser.parse_args(['-h']) 
usage: ipython3 [-h] [-f FOO]  
optional arguments: 
    -h, --help   Show this help message and exit. 
    -f FOO, --foo FOO 

:

bu yardımı üretenlistesi, bazı kişilerin gereksiz olduğunu düşündüğü 'özel' özelliğini kullanır. Fakat Python'da kamu/özel ayrım sıkı değildir ve özenle kırılabilir. Martijn bunu parser._positionals.title'a erişerek yapıyor.

o grup başlığını değiştirmek için başka bir yol

ogroup=parser.add_argument_group('Correct Optionals Title') 
ogroup.add_argument('-v',...) 
ogroup.add_argument('-h',...)