我需要为启动工作程序编写django管理命令(与django不相关)。我从中得到启发,docker-compose up并希望以下行为:
services = ['a', 'b', 'c']
import argparse
ap = argparse.ArgumentParser()
ap.add_argument('services', ???)
ap.parse_args(''.split())
Namespace(services=[])
ap.parse_args('a b'.split())
Namespace(services=['a', 'b'])
ap.parse_args('a b d'.split()) : error: argument services: invalid choice: 'd' (choose from 'a', 'b', 'c')
ap.parse_args('a b b'.split())
: error: argument services: duplicated choice: 'b'
目前,我已经测试了几种方法,但是主要的障碍是,如果choices=services提供,nargs='*'则不再允许使用0参数。
ap.add_argument('services', choices=services, nargs='*')
ap.parse_args(''.split())
usage: [-h] [{a,b,c} [{a,b,c} ...]]
: error: argument services: invalid choice: [] (choose from 'a', 'b', 'c') 尽管有一种可行的解决方案(具有自定义类型)和一种解决方案(稍后再验证),但他们感觉不对。
另一种解决方案是将[]文字空列表添加到中choices。
ap.add_argument('services', choices=services + [[]], nargs='*')
ap.parse_args(''.split())
Namespace(services=[])
这是由于nargs产生一个空列表并choices根据结果进行验证。该choiceskwarg变['a', 'b', 'c', []],这看起来奇怪,但这是需要两个选项一起工作。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。