كيف بإمكاني تنسيق المساعدة حجة الموضعية باستخدام optparse بايثون؟

StackOverflow https://stackoverflow.com/questions/642648

سؤال

وكما ذكر في مستندات لل يستخدم optparse.OptionParser على IndentedHelpFormatter لإخراج مساعدة خيار تنسيق، والتي والتي وجدت بعض <لأ href = "http://corebio.googlecode.com/svn/tags/0.5.0/apidocs/optparse.IndentedHelpFormatter-class.html" يختلط = "noreferrer"> وثائق API .

<القوي> أريد لعرض نص التعليمات بتنسيق مشابه للمطلوب، والحجج الموضعية في نص الاستخدام. هناك محول أو نمط استخدام بسيطة والتي يمكن استخدامها لتنسيق مماثل حجة الموضعية؟

توضيح

ويفضل فقط باستخدام stdlib. Optparse لا كبيرة إلا لهذا الوضوح تنسيق واحد، وأنا أشعر أننا ينبغي أن تكون قادرة على إصلاح دون استيراد مجموعات أخرى كاملة. : -)

هل كانت مفيدة؟

المحلول

وأفضل رهان سيكون لكتابة التصحيح إلى وحدة optparse. في غضون ذلك، يمكنك إنجاز هذا مع فئة OptionParser معدلة بشكل طفيف. هذه ليست مثالية، ولكن سوف تحصل على ما تريد القيام به.

#!/usr/bin/env python
from optparse import OptionParser, Option, IndentedHelpFormatter

class PosOptionParser(OptionParser):
    def format_help(self, formatter=None):
        class Positional(object):
            def __init__(self, args):
                self.option_groups = []
                self.option_list = args

        positional = Positional(self.positional)
        formatter = IndentedHelpFormatter()
        formatter.store_option_strings(positional)
        output = ['\n', formatter.format_heading("Positional Arguments")]
        formatter.indent()
        pos_help = [formatter.format_option(opt) for opt in self.positional]
        pos_help = [line.replace('--','') for line in pos_help]
        output += pos_help
        return OptionParser.format_help(self, formatter) + ''.join(output)

    def add_positional_argument(self, option):
        try:
            args = self.positional
        except AttributeError:
            args = []
        args.append(option)
        self.positional = args

    def set_out(self, out):
        self.out = out
def main():
    usage = "usage: %prog [options] bar baz"
    parser = PosOptionParser(usage)
    parser.add_option('-f', '--foo', dest='foo',
                      help='Enable foo')
    parser.add_positional_argument(Option('--bar', action='store_true',
                                   help='The bar positional argument'))
    parser.add_positional_argument(Option('--baz', action='store_true',
                                   help='The baz positional argument'))
    (options, args) = parser.parse_args()
    if len(args) != 2:
        parser.error("incorrect number of arguments")
    pass

if __name__ == '__main__':
    main()

وإخراج تحصل من تشغيل هذا:

Usage: test.py [options] bar baz

  Options:
    -h, --help         show this help message and exit
    -f FOO, --foo=FOO  Enable foo

Positional Arguments:
  bar  The bar positional argument
  baz  The baz positional argument

نصائح أخرى

وحاول إلقاء نظرة على argparse . وتقول الوثائق التي تدعم الحجج موقف وأجمل تبحث رسائل مساعدة.

وسأكون مهتما في حل نظيفة لذلك؛ لكنني لم أتمكن من أجل التوصل إلى واحد. وOptionParser حقا تركز كليا على الخيارات؛ أنها لا تعطيك أي شيء للعمل مع وسائط الموقف، بقدر ما استطعنا العثور عليها.

ما فعلته كان لإنشاء قائمة من كتل وثائق قليلا لكل من حججي الموضعية، وذلك باستخدام \ts للحصول على التباعد الصحيح. ثم انضممت لهم أسطر جديدة، وإلحاق ذلك إلى سلسلة "الاستخدام" التي يحصل تمريرها إلى OptionParser.

ويبدو على ما يرام، لكنه يشعر سخيفة، وبالطبع أن الوثائق ينتهي تظهر أعلى قائمة من الخيارات. لم أجد أي طريقة حول ذلك، أو كيفية القيام بأي أشياء معقدة، أي يتم وصف مجموعة معينة من الخيارات تحت وصف لARG الموضعية، لأنها لا تنطبق إلا على أن وسيطة.

ونظرت إلى أساليب OptionParser ل-الترقيع القرد وأتذكر (كان هذا العام أو قبل ذلك) أنه لا يمكن أن يكون من الصعب، ولكن لم أكن أريد أن تسلك هذا المسار.

ومعظم نص التعليمات الحجج الموضعية يشبه شكل يكثر استخدامها في صفحات الرجل ل* صناديق نيكس. نلقي نظرة على كيف تم توثيقه الأمر 'حزب المحافظين' . نص التعليمات الخاصة بك ينبغي أن تشبه.

وإلا ما دمت ملء "مساعدة" حجة أثناء استخدام محلل، يجب على وثائق إنتاج نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top