Существует множество модулей Python для анализа и координации параметров командной строки (argparse, getopt, blargs и т. Д.). И Python наделен хорошими встроенными функциями / идиомами для обработки различных аргументов функций (например, значения по умолчанию, * varargs, ** keyword_args). Но когда я читаю код различных проектов для функций верхнего уровня, я вижу заметно меньше дисциплины и стандартизации аргументов функций, чем аргументов командной строки.
Для простых функций это не проблема; встроенные функции аргумента прекрасно работают и более чем достаточны. Но есть много функционально богатых модулей, чьи функции верхнего уровня предоставляют множество различных аргументов и опций (некоторые дополняют или исключают), различные режимы работы, значения по умолчанию, переопределения и т. Д., То есть они имеют сложность аргументов приближается к аргументу командной строки. И они, кажется, в значительной степени обрабатывают свои аргументы ad hoc способами.
Учитывая количество модулей обработки командной строки и то, насколько изящными они стали со временем, я бы ожидал, по крайней мере, несколько модулей для упрощения обработки сложных аргументов функций. Но я безуспешно искал PyPi, stackoverflow и Google. Итак ... есть ли модули (не командная строка!), Которые вы бы порекомендовали?
--- обновление с примером ---
Трудно привести действительно простой конкретный пример, потому что вариант использования не появляется, пока вы не разберетесь со сложным модулем. Но вот попытка объяснить проблему в коде: модуль форматирования со значениями по умолчанию, которые можно переопределить при создании экземпляра форматера или при вызове функции / метода. Для того, чтобы иметь только несколько опций, уже есть очень много словоблоков обработки опций, и имена опций повторяются ad nauseam .
defaults = { 'indent': 4,
'prefix': None,
'suffix': None,
'name': 'aFormatter',
'reverse': False,
'show_name': False
}
class Formatter(object):
def __init__(self, **kwargs):
self.name = kwargs.get('name', defaults['name'])
self.indent = kwargs.get('indent', defaults['indent'])
self.prefix = kwargs.get('prefix', defaults['prefix'])
self.suffix = kwargs.get('suffix', defaults['suffix'])
self.reverse = kwargs.get('reverse', defaults['reverse'])
self.show_name = kwargs.get('show_name', defaults['show_name'])
def show_lower(self, *args, **kwargs):
indent = kwargs.get('indent', self.indent) or 0
prefix = kwargs.get('prefix', self.prefix)
suffix = kwargs.get('suffix', self.suffix)
reverse = kwargs.get('reverse', self.reverse)
show_name = kwargs.get('show_name', self.show_name)
strings = []
if show_name:
strings.append(self.name + ": ")
if indent:
strings.append(" " * indent)
if prefix:
strings.append(prefix)
for a in args:
strings.append(a.upper() if reverse else a.lower())
if suffix:
strings.append(suffix)
print ''.join(strings)
if __name__ == '__main__':
fmt = Formatter()
fmt.show_lower("THIS IS GOOD")
fmt.show_lower("THIS", "IS", "GOOD")
fmt.show_lower('this IS good', reverse=True)
fmt.show_lower("something!", show_name=True)
upper = Formatter(reverse=True)
upper.show_lower("this is good!")
upper.show_lower("and so is this!", reverse=False)