Случайный выбор без учета регистра без потери информации о регистре в списке выбора - PullRequest
4 голосов
/ 01 июля 2019

У меня очень похожий вопрос , но предоставленные решения не подходят, так как у меня немного другой вариант использования.Для простоты я адаптирую свой вопрос к уже отвеченному.

Можно ли проверить argparse выборов без учета регистра, без потери информации с учетом регистра?

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 (аналогичновопрос) не работает в моем случае.Это только позволяет вводу аргумента иметь произвольный регистр.Так что, если мой список выбора будет строчным, AdAsyN будет работать, но если я сохраню список выбора в CamelCase, заглавные буквы в списке выбора также должны быть заглавными для аргумента.

У кого-нибудь есть решение для меня, где я могу сохранить регистр своего списка выбора, полностью игнорируя регистр для пользовательского ввода?

1 Ответ

2 голосов
/ 02 июля 2019

Вы можете настроить функцию типа для выполнения поиска в списке 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')

Функция закрытия взята из этого ответа .
Ответ основан на комментарии @hpaulj.

...