gpt4 book ai didi

Python argparse 在类型之前检查选择

转载 作者:行者123 更新时间:2023-11-28 16:26:05 25 4
gpt4 key购买 nike

我正在尝试让用户能够传入一个函数名称。出于某种原因,argparse 似乎在检查选择之前执行类型检查/转换。这是一个错误吗?最好的办法是什么?

import argparse

def foo():
return 'foo'

def bar():
return 'bar'

parser = argparse.ArgumentParser()
functions = {f.__name__:f for f in [foo, bar]}
parser.add_argument("function", type=lambda f: functions.get(f), help="which function", choices=functions)
args = parser.parse_args()
print(args.function())

抛出:

$ python blah.py foo
usage: blah.py [-h] {foo,bar}
blah.py: error: argument function: invalid choice: <function foo at 0x7f65746dd848> (choose from 'foo', 'bar')

最佳答案

是的,在解析 type 然后 choices 的过程中,顺序是明确且有意的(而不是偶然的)。在准备将 arg_strings 分配给 namespace 时,它会调用 _get_values,它会执行以下操作:

  def _get_values(self, action, arg_strings)
.... (various nargs tests)
value = self._get_value(action, arg_string)
self._check_value(action, value)
return value

_get_value 应用action.type 函数,_check_value 测试

value not in action.choices  

对于解析 choices 只需要响应 in (__contains__) 表达式。

因此选择必须反射(reflect)转换后的值。如果typeint,那么choices=[1,2,3]是正确的,['1','2' ,'3'] 不是。

选项的显示存在一些(大部分 Unresolved )错误问题。长列表,例如range(100) 用于解析,但显示效果不佳。并且显示还要求 choices 是可迭代的(例如列表、元组、字典)。此显示问题会影响使用、帮助和错误消息(每个格式 choices 略有不同)。

metavar 是替换不需要的 choices 列表的最强大工具。我必须运行一个测试用例,看看它是否能解决所有 3 种情况。

关于Python argparse 在类型之前检查选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36479850/

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