Существует множество модулей Python для разбора и согласования параметров командной строки (argparse, getopt, blargs и т.д.). И Python благословлен хорошими встроенными возможностями/идиомами для обработки различных аргументов функций (например, значения по умолчанию, *varargs, **keyword_args). Но когда я читаю код различных проектов для функций верхнего уровня, я вижу значительно меньшую дисциплину и стандартизацию аргументов функций, чем аргументов командной строки.
Для простых функций это не является проблемой; встроенные функции аргументов работают отлично и их более чем достаточно. Но есть много функционально богатых модулей, чьи функции верхнего уровня предоставляют множество различных аргументов и опций (некоторые дополняют или исключают друг друга), различные режимы работы, значения по умолчанию, переопределения и т.д. - то есть, сложность аргументов приближается к сложности аргументов командной строки. И они, похоже, в основном обрабатывают свои аргументы специальными способами.
Учитывая количество модулей обработки командной строки, и то, насколько они усовершенствовались со временем, я ожидал бы, по крайней мере, несколько модулей для упрощения работы со сложными аргументами функций. Но я безуспешно искал в 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)