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(",")]
...
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]]