Control formatting of the argparse help argument list?

前端 未结 4 1025
再見小時候
再見小時候 2021-02-05 01:55
import argparse
parser = argparse.ArgumentParser(prog=\'tool\')
args = [(\'-u\', \'--upf\', \'ref. upf\', dict(required=\'True\')),
        (\'-s\', \'--skew\', \'ref. s         


        
4条回答
  •  日久生厌
    2021-02-05 02:45

    Inspired by @jfs's answer, I have come up with this solution:

    def make_wide(formatter, w=120, h=36):
        """Return a wider HelpFormatter, if possible."""
        try:
            # https://stackoverflow.com/a/5464440
            # beware: "Only the name of this class is considered a public API."
            kwargs = {'width': w, 'max_help_position': h}
            formatter(None, **kwargs)
            return lambda prog: formatter(prog, **kwargs)
        except TypeError:
            warnings.warn("argparse help formatter failed, falling back.")
            return formatter
    

    Having that, you can call it with any HelpFormatter that you like:

    parser = argparse.ArgumentParser(
        formatter_class=make_wide(argparse.ArgumentDefaultsHelpFormatter)
    )
    

    or

    parser = argparse.ArgumentParser(
        formatter_class=make_wide(argparse.HelpFormatter, w=140, h=20)
    )
    

    What this does is make sure that the wider formatter can actually be created using the width and max_help_position arguments. If the private API changes, that is noted by make_wide by a TypeError and the formatter is returned unchanged. That should make the code more reliable for deployed applications.

    I'd welcome any suggestions to make this more pythonic.

提交回复
热议问题