顶级解析器的默认值将覆盖子解析器的默认值,因此将
func忽略在子解析器上设置默认值,但是
newstate来自子解析器默认值的值是正确的。
我认为您不想使用子命令。当可用选项和位置参数根据所选择的子命令而变化时,将使用子命令。但是,您没有其他选项或位置参数。
以下代码似乎可以满足您的要求:
import argparsedef print_state(): print "Print state"def set_state(s): print "Setting state to " + sparser = argparse.ArgumentParser()parser.add_argument('state', choices = ['ON', 'OFF'], nargs='?')args = parser.parse_args()if args.state is None: print_state()elif args.state in ('ON', 'OFF'): set_state(args.state)
注意的可选参数
parser.add_argument。“ choices”参数指定允许的选项,同时将“ nargs”设置为“?”
指定应使用1个参数(如果可用),否则不使用。
编辑:
如果要添加带有参数的FORCE命令,并为ON和OFF命令提供单独的帮助文本,则需要使用子命令。不幸的是,似乎没有指定默认子命令的方法。但是,您可以通过检查空的参数列表并提供自己的参数来解决此问题。这是一些示例代码,说明了我的意思:
import argparseimport sysdef print_state(ignored): print "Print state"def set_state(s): print "Setting state to " + sparser = argparse.ArgumentParser()subparsers = parser.add_subparsers()on = subparsers.add_parser('ON', help = 'On help here.')on.set_defaults(func = set_state, newstate = 'ON')off = subparsers.add_parser('OFF', help = 'Off help here.')off.set_defaults(func = set_state, newstate = 'OFF')prt = subparsers.add_parser('PRINT')prt.set_defaults(func = print_state, newstate = 'N/A')force = subparsers.add_parser('FORCE' , help = 'Force help here.')force.add_argument('newstate', choices = [ 'ON', 'OFF' ])force.set_defaults(func = set_state)if (len(sys.argv) < 2): args = parser.parse_args(['PRINT'])else: args = parser.parse_args(sys.argv[1:])args.func(args.newstate)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)