我正在尝试制作一个Python程序,使用argparse
模块解析命令行选项。
我想创建一个可选的参数,可以是命名参数或位置参数。例如,我希望 myScript --username=batman
和 myScript batman
做相同的事情。同时,myScript
也应该是有效的,不需要指定用户名。这是否可能?如果是,如何实现呢?
我尝试了类似下面代码的各种方法,但都没有成功。
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin")
group.add_argument("user-name", default="admin")
args = parser.parse_args()
编辑:上面的代码会抛出异常,显示ValueError: mutually exclusive arguments must be optional
。
我正在使用Python 2.7.2和OS X 10.8.4。
编辑:我尝试了Gabriel Jacobsohn的建议,但在某些情况下无法正常工作。
我尝试了这个:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin", nargs="?")
group.add_argument("user_name", default="admin", nargs="?")
args = parser.parse_args()
print(args)
运行myScript batman
将打印Namespace(user_name='batman')
,但myScript -u batman
和myScript --user-name=batman
将打印Namespace(user_name='admin')
。
我尝试在第一个add_argument
行中将名称user-name
更改为user_name
,有时会导致命名空间中同时出现batman
和admin
,或者根据程序运行方式而出现错误。
我尝试在第二个add_argument
行中将名称user_name
更改为user-name
,但这将根据程序运行方式打印Namespace(user-name='batman', user_name='admin')
或Namespace(user-name='admin', user_name='batman')
。
--match
参数所做的是相同的事情。 - Elias Zamaria