Python 3.x 限制argparse add_参数中的输入字符串长度

Python 3.x 限制argparse add_参数中的输入字符串长度,python-3.x,argparse,Python 3.x,Argparse,我想添加字符串类型的参数,但将字符串长度限制为1 group.add_argument( "--test_param", dest="test_param", type=str, required=True, default=None, ) 是否有任何方法可以在这里执行此操作而不必稍后通过检查len(test_param)来引发错误?您可以尝试在类型中使用lambda函数 Ex: import arg

我想添加字符串类型的参数,但将字符串长度限制为1

   group.add_argument(
        "--test_param",
        dest="test_param",
        type=str,
        required=True,
        default=None,
    )

是否有任何方法可以在这里执行此操作而不必稍后通过检查
len(test_param)
来引发错误?

您可以尝试在
类型中使用
lambda
函数

Ex:

import argparse

group = argparse.ArgumentParser(description='Data.')
group.add_argument( 
        "--test_param",
        dest="test_param",
        type=lambda x: x if x.isalpha() and len(x) <=1 else False,   #Sample Function
        required=True,
        default=None,
    )

args = group.parse_args()
value = getattr(args, 'test_param')
if value:
    print(value)
else:
    print("error!!!")
python sample.py --test_param fddd  #->>error!!
python sample.py --test_param f     #->>f

您可以在添加参数时使用可用的choices参数,例如在我的代码中,我只想从1或2中进行选择。我使用了以下代码段,如下所示:

parser.add_argument(
    "report",
    type=int,
    metavar="[report #]",
    help="1. for Annual Max/Min Temperature 2. for Hottest day of each year",
    choices=[1, 2]

)
它将仅限制来自这些选项的输入,如果您给出了以下选项中的一个,它将显示错误结果:

usage: [report#] [data_dir]

[report #]
1 for Annual Max/Min Temperature
2 for Hottest day of each year
            
[data_dir]
Directory containing weather data files
        
main.py: error: argument [report #]: invalid choice: 3 (choose from 1, 2)
如果不想添加选项,可以使用lamda或验证数据的函数。您可以从下面的示例中获得帮助:

parser.add_argument(
        "data_dir",
        type=check_directory_availability,
        metavar="[data_directory]",
        help="Directory containing weather data files",
    )
def check_directory_availability(dir_name):

    if not os.path.isdir(dir_name):
        raise NotADirectoryError("Provided directory name doesn't exists")
    return dir_name

希望它能对您有所帮助。

需要自定义
类型
功能;并不是说解析后的测试有什么问题。但这需要我在选项中包含所有可能的单个字符串的列表,这相当麻烦。我已经添加了这个问题的答案。你也可以看到。