我写了下面的代码。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='version',
version='%(prog)s 1.0\nCopyright (c) 2016 Lone Learner')
parser.parse_args()
这将生成以下输出。
$ python foo.py --version
foo.py 1.0 Copyright (c) 2016 Lone Learner
你可以看到换行符丢失了。我想版权声明出现在下一行。
如何在版本输出消息中保留新行?
我仍然希望argparse计算python foo.py -h
的输出应该如何布局,并且自动换行,但是我希望version输出是多行输出,换行符保持不变。
5条答案
按热度按时间mdfafbf11#
RawTextHelpFormatter
将关闭自动换行,允许显式的\n
出现。但是它将影响所有help
行。没有办法挑选。要么接受默认的换行,要么在所有帮助行中显式地换行。您对帮助格式的挑剔程度已经达到了自己研究
HelpFormatter
代码所需的程度。pgky5nke2#
还有
argparse.RawDescriptionHelpFormatter
。它只保留
description
和epilog
,只 Package 参数帮助字符串,OP的要求正好相反。hwamh0ep3#
您最好使用定制的
argparse.Action
。jmo0nnb34#
只是不要使用
action='version'
,相同的模式可以在-h
中重复。2o7dmzc55#
虽然我同意Hamish的观点,即最好使用自定义Action,但也可以利用更多的
argparse
机制,并与之进行更全面的集成。这个
_MyVersionAction
类是argparse._VersionAction
的子类,并且90%是其代码的直接复制粘贴。¹(它甚至没有定义__init__
,只是继承了父类的。)但是它对
__call__
方法做了最小的调整,强制它的格式化器为argparse.RawDescriptionHelpFormatter
,原始代码用parser._get_formatter()
查找解析器范围的格式化器,但是我们不希望在这里使用它。然后,在创建解析器示例之后,我们为
_MyVersionAction
注册操作字符串'my_version'
,以便它可以像任何其他操作一样在add_argument(..., action='my_version')
中使用。例如,这允许您在版本字符串中使用
%(prog)s
,或者使用解析器示例中的其他数据,还可以在多个程序中重用action='my_version'
,因为版本字符串不是硬编码的,您只需像往常一样将其传递给add_argument()
即可。输出
注解
1.就像评论说的,我不知道为什么在
self.version
没有设置的情况下,这个动作会试图获取parser.version
--没有支持的API来设置parser
对象的version
属性。你必须用parser.version = X.Y
手动强制设置它。我怀疑check只是从旧版本继承来的代码。或者甚至从optparse
天开始。