<code>argparse</code>

问题描述 投票:0回答:1
float

等)的

type
(列表中的所有参数都有相同类型)。列表中的值必须转换为指定类型。 I具有以下基线实现,它确实有效,但是如果感觉有点笨拙,尤其是在添加更复杂的类型(甚至是处理参数输入列表的功能)时。我想知道是否有一种内置/更顺畅/更多的规范方法可以做到这一点?
script.py
import argparse

arg_type_dict = {t.__name__: t for t in [str, int, float]}

def main(
    sweep_arg_type: str,
    sweep_arg_vals: list,
):
    arg_type = arg_type_dict[sweep_arg_type]
    val_list = [arg_type(val_str) for val_str in sweep_arg_vals]

    print(val_list)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--sweep_arg_vals", required=True, nargs="+")
    parser.add_argument(
        "--sweep_arg_type",
        required=True,
        choices=sorted(arg_type_dict.keys()),
    )
    args = parser.parse_args()

    main(
        args.sweep_arg_type,
        args.sweep_arg_vals,
    )
us示例:

python script.py -h python script.py --sweep_arg_type int --sweep_arg_vals 0 1 10 -3 python script.py --sweep_arg_type float --sweep_arg_vals 0 1 10 -3 python script.py --sweep_arg_type float --sweep_arg_vals 1.2 3.4 python script.py --sweep_arg_type str --sweep_arg_vals abc def lmnop

i写了一个名为
argtypes

执行此功能的小模块:

argtypes.py

def get_types() -> list["ArgType"]:
    return [IntType(), FloatType(), StrType(), IntList()]

def get_dict():
    return {
        arg_type.get_name(): arg_type
        for arg_type in get_types()
    }

def get_choices():
    return sorted(get_dict().keys())

def convert_arg_list(
    arg_type_str: str,
    arg_vals: list,
):
    type_dict = get_dict()
    arg_type = type_dict[arg_type_str]
    typed_arg_vals = [arg_type.convert_arg(val) for val in arg_vals]
    return typed_arg_vals

class ArgType:
    def convert_arg(self, val_str: str):
        raise NotImplementedError

    @classmethod
    def get_name(cls):
        return cls.__name__.replace("Type", "").lower()

class IntType(ArgType):
    def convert_arg(self, val_str):
        return int(val_str)

class FloatType(ArgType):
    def convert_arg(self, val_str):
        return float(val_str)

class StrType(ArgType):
    def convert_arg(self, val_str):
        return str(val_str)

class IntList(ArgType):
    def convert_arg(self, val_str):
        return [int(i) for i in val_str.split(",")]

...
python command-line-interface argparse
1个回答
0
投票
反应

script.py

import argparse import argtypes def main( sweep_arg_type: str, sweep_arg_vals: list, ): val_list = argtypes.convert_arg_list(sweep_arg_type, sweep_arg_vals) print(val_list) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--sweep_arg_vals", required=True, nargs="+") parser.add_argument( "--sweep_arg_type", required=True, choices=argtypes.get_choices(), ) args = parser.parse_args() main( args.sweep_arg_type, args.sweep_arg_vals, )

additional用法示例:

# All usage examples in the original question still work the same as before python script.py --sweep_arg_type intlist --sweep_arg_vals 0,1,2 10,100,1000 4 3,-2 -5 # >>> [[0, 1, 2], [10, 100, 1000], [4], [3, -2], [-5]]
    

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.