不区分大小写的 argparse 选择不会丢失选择列表中的大小写信息
Case insensitive argparse choices without losing case information in choices list
我有一个 very similar question 但提供的解决方案不适合,因为我的用例略有不同。
为了简单起见,我将根据已经回答的问题调整我的问题。
是否可以在不丢失区分大小写信息的情况下以不区分大小写的方式检查 argparse choices?
import argparse
choices = ["ADASYN", "BorderlineSMOTE", "KMeansSMOTE"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "adasyn"]))
这导致:
choices.py: error: argument -p: invalid choice: 'adasyn' (choose from 'ADASYN', 'BorderlineSMOTE', 'KMeansSMOTE')
我显然可以使用 type.lower,但是我的选择列表需要小写并且我失去了很多 -h 的可读性(帮助输出).另一方面,我希望我的用户能够使用不同的大小写,只要两者的字符串 .lower() 相同即可。
@hpaulj 的 solution provided(类似问题)在我的情况下不起作用。它只允许参数输入具有任意大小写。因此,如果我的选择列表是小写 AdAsyN 会起作用,但如果我将选择列表保留为 CamelCase,则选择列表中的大写字母对于参数也必须是大写。
有没有人能为我提供解决方案,让我可以保留选择列表的大小写,同时完全忽略用户输入的大小写?
您可以自定义类型函数以在 choices 列表中执行搜索,而不是简单的类型转换。这看起来有点老套,但工作正常。
def make_type(choices):
def find_choice(choice):
for key, item in enumerate([choice.lower() for choice in choices]):
if choice.lower() == item:
return choices[key]
else:
return choice
return find_choice
choices = ["ADASYN", "BorderlineSMOTE", "KMeansSMOTE"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices, type=make_type(choices))
print(parser.parse_args("-p adasyn".split()))
# Namespace(p='ADASYN')
print(parser.parse_args("-p ADASYN".split()))
# Namespace(p='ADASYN')
print(parser.parse_args("-p aDaSyN".split()))
# Namespace(p='ADASYN')
print(parser.parse_args("-p adasyn1".split()))
# usage: argsaction.py [-h] [-p {ADASYN,BorderlineSMOTE,KMeansSMOTE}]
# argsaction.py: error: argument -p: invalid choice: 'adasyn1' (choose from 'ADASYN', 'BorderlineSMOTE', 'KMeansSMOTE')
取自此 answer 的闭包函数。
答案基于@hpaulj 评论。
我有一个 very similar question 但提供的解决方案不适合,因为我的用例略有不同。 为了简单起见,我将根据已经回答的问题调整我的问题。
是否可以在不丢失区分大小写信息的情况下以不区分大小写的方式检查 argparse choices?
import argparse
choices = ["ADASYN", "BorderlineSMOTE", "KMeansSMOTE"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "adasyn"]))
这导致:
choices.py: error: argument -p: invalid choice: 'adasyn' (choose from 'ADASYN', 'BorderlineSMOTE', 'KMeansSMOTE')
我显然可以使用 type.lower,但是我的选择列表需要小写并且我失去了很多 -h 的可读性(帮助输出).另一方面,我希望我的用户能够使用不同的大小写,只要两者的字符串 .lower() 相同即可。
@hpaulj 的 solution provided(类似问题)在我的情况下不起作用。它只允许参数输入具有任意大小写。因此,如果我的选择列表是小写 AdAsyN 会起作用,但如果我将选择列表保留为 CamelCase,则选择列表中的大写字母对于参数也必须是大写。
有没有人能为我提供解决方案,让我可以保留选择列表的大小写,同时完全忽略用户输入的大小写?
您可以自定义类型函数以在 choices 列表中执行搜索,而不是简单的类型转换。这看起来有点老套,但工作正常。
def make_type(choices):
def find_choice(choice):
for key, item in enumerate([choice.lower() for choice in choices]):
if choice.lower() == item:
return choices[key]
else:
return choice
return find_choice
choices = ["ADASYN", "BorderlineSMOTE", "KMeansSMOTE"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices, type=make_type(choices))
print(parser.parse_args("-p adasyn".split()))
# Namespace(p='ADASYN')
print(parser.parse_args("-p ADASYN".split()))
# Namespace(p='ADASYN')
print(parser.parse_args("-p aDaSyN".split()))
# Namespace(p='ADASYN')
print(parser.parse_args("-p adasyn1".split()))
# usage: argsaction.py [-h] [-p {ADASYN,BorderlineSMOTE,KMeansSMOTE}]
# argsaction.py: error: argument -p: invalid choice: 'adasyn1' (choose from 'ADASYN', 'BorderlineSMOTE', 'KMeansSMOTE')
取自此 answer 的闭包函数。
答案基于@hpaulj 评论。