gpt4 book ai didi

Python 参数解析 : command-line argument that can be either named or positional

转载 作者:太空狗 更新时间:2023-10-29 18:04:44 25 4
gpt4 key购买 nike

我正在尝试制作一个使用 argparse 模块来解析命令行选项的 Python 程序。

我想做一个可选的参数,可以是命名的或位置的。例如,我希望 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

我在 OS X 10.8.4 上使用 Python 2.7.2。

编辑:我尝试了 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 batmanmyScript - -user-name=batman 将打印 Namespace(user_name='admin')

我尝试在第一个 add_argument 行中将名称 user-name 更改为 user_name,有时这会导致 batmanadmin 或错误,具体取决于我运行程序的方式。

我尝试在第 2 行 add_argument 中将名称 user_name 更改为 user-name 但这会打印 Namespace(user -name='batman', user_name='admin')Namespace(user-name='admin', user_name='batman'),具体取决于我运行程序的方式。

最佳答案

ArgumentParser 的工作方式是,它总是在解析可选参数后检查任何尾随位置参数。因此,如果您有一个与可选参数同名的位置参数,并且它没有出现在命令行中的任何位置,则可以保证覆盖可选参数(使用其默认值或 ).

坦率地说,这对我来说似乎是一个错误,至少在互斥组中使用时是这样,因为如果您明确指定了参数,那将是一个错误。

也就是说,我建议的解决方案是为位置参数指定一个不同的名称。

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-u','--username')
group.add_argument('static_username',nargs='?',default='admin')

然后在解析时使用可选的用户名(如果存在),否则回退到位置static_username

results = parser.parse_args()
username = results.username or results.static_username

我意识到这不是一个特别好的解决方案,但我认为没有任何答案会是。

关于Python 参数解析 : command-line argument that can be either named or positional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com