Получение значения словаря по одному из элементов ключа
Есть задача, заключающая в том, чтобы реализовать cli для изменения регистра строки
Пока имитировал ситуацию, написал так
CHOICE = {
('-l', '--lower'): 'lower',
('-u', '--upper'): 'upper',
('-t', '--title'): 'title',
('-c', '--capitalize'): 'capitalize'
}
str_ = 'HeLlO WoRlD'
print(getattr(str_, CHOICE['-l'])())
Опции -l, --lower, ... будут прилетать при запуске
py test.py [OPTION] "HeLlO WoRlD"
Но выводит ошибку
KeyError: '-l'
Что можно сделать, чтобы это работало?
P.S. Ещё есть такой вариант, где всё работает, но всё равно хотелось бы использовать первый вариант
CHOICE = {
'-l': 'lower',
'--lower': 'lower',
'-u': 'upper',
'--upper': 'upper',
'-t': 'title',
'--title': 'title',
'-c': 'capitalize',
'--capitalizer': 'capitalize',
}
str_ = 'HeLlO WoRlD'
print(getattr(str_, CHOICE['-l'])()) # hello world
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Для разбора аргументов командной строки лучше использовать стандартный модуль argparse. Тогда не будет проблем c короткими/длинными ключами параметров. И также можно будет определить ограничения на взаимоисключающие аргументы.
Пример:
import argparse
parser = argparse.ArgumentParser(description='My tool')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-l', '--lower', dest="func", action='store_const', const='lower', help='To lower string')
group.add_argument('-u', '--upper', dest="func", action='store_const', const='upper', help='To upper string')
group.add_argument('-t', '--title', dest="func", action='store_const', const='title', help='To title string')
group.add_argument('-c', '--capitalize', dest="func", action='store_const', const='capitalize', help='To capitalized string')
parser.add_argument('text', help='Text to convert')
args = parser.parse_args()
print(getattr(args.text, args.func)())
Вышеприведённый код сразу умеет вот это всё:
D:\Programming\Python\1>test.py
usage: test.py [-h] (-l | -u | -t | -c) text
test.py: error: the following arguments are required: text
D:\Programming\Python\1>test.py "hEllO wOrlD"
usage: test.py [-h] (-l | -u | -t | -c) text
test.py: error: one of the arguments -l/--lower -u/--upper -t/--title -c/--capitalize is required
D:\Programming\Python\1>test.py -l "hEllO wOrlD"
hello world
D:\Programming\Python\1>test.py -u "hEllO wOrlD"
HELLO WORLD
D:\Programming\Python\1>test.py -t "hEllO wOrlD"
Hello World
D:\Programming\Python\1>test.py -c "hEllO wOrlD"
Hello world
D:\Programming\Python\1>test.py -l -u "hEllO wOrlD"
usage: test.py [-h] (-l | -u | -t | -c) text
test.py: error: argument -u/--upper: not allowed with argument -l/--lower
D:\Programming\Python\1>test.py -h
usage: test.py [-h] (-l | -u | -t | -c) text
My tool
positional arguments:
text Text to convert
optional arguments:
-h, --help show this help message and exit
-l, --lower To lower string
-u, --upper To upper string
-t, --title To title string
-c, --capitalize To capitalized string