Istnieje wiele modułów Pythona do analizowania i koordynowania opcji wiersza poleceń (argparse, getopt, blargs itp.). A Python jest wyposażony w dobre wbudowane funkcje/idiomy do obsługi różnych argumentów funkcji (np. Wartości domyślne, * varargs, ** keyword_args). Ale kiedy czytam kod różnych projektów dla funkcji najwyższego poziomu, widzę wyraźnie mniejszą dyscyplinę i standaryzację argumentów funkcji niż argumenty wiersza poleceń.Zalecane moduły Pythona do obsługi argumentów funkcji?
Dla prostych funkcji nie stanowi to problemu; wbudowane funkcje argumentów działają świetnie i są więcej niż wystarczające. Ale istnieje wiele funkcjonalnie bogatych modułów, których funkcje najwyższego poziomu zapewniają wiele różnych argumentów i opcji (niektóre uzupełniające lub wyłączne), różne tryby działania, ustawienia domyślne, nadpisywanie itp. - to znaczy, że mają złożoność argumentów zbliżając się do argumentów linii poleceń. I wydaje się, że w dużej mierze radzą sobie z ich argumentami w ad hoc sposobów.
Biorąc pod uwagę liczbę modułów przetwarzania wiersza poleceń, a także to, jak wyrafinowane stały się z biegiem czasu, spodziewałbym się przynajmniej kilku modułów upraszczających spory skomplikowanych argumentów funkcji. Ale przeszukałem PyPi, Stackoverflow i Google bez powodzenia. A więc ... czy są jakieś polecane moduły obsługi argumentów funkcji (nie wiersza poleceń!)?
--- aktualizacja z przykładu ---
Trudno podać konkretny przykład naprawdę proste, ponieważ przypadek użycia nie pojawi się dopóki masz do czynienia z wyrafinowanym modułu. Oto przykład wyjaśnienia problemu w kodzie: moduł formatyzatora z wartościami domyślnymi, które można zastąpić w instancji formatera lub po wywołaniu funkcji/metody. Aby mieć tylko kilka opcji, jest już strasznie dużo verbiage obsługi opcji, a nazwy opcji są powtarzane 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)
Mówisz o def somefunc (requiredValue, optionalValue = None, * args, ** kwargs)?Jeśli tak, to kod do swojej funkcji, tak jak byś obsługiwał argumenty linii poleceń pochodzące z terminala (co jest samą funkcją). – platinummonkey
Czy możesz podać przykład funkcji ze złożonym interfejsem i pomysł jakich uproszczeń można oczekiwać od biblioteki? (O ile jest to warte, wydaje mi się, że istnieją pewne moduły Pythona z dość okropnymi interfejsami funkcyjnymi. Zaleciłbym, aby traktować je jako odstraszające przykłady, zamiast próbować zrobić coś takiego samemu.) –
@SvenMarnach Naprawdę są bardzo ostrożne , przykłady "unikaj za wszelką cenę"! Ale gdy funkcja (powiedzmy funkcja fabryczna) jest punktem wejścia dla wyrafinowanej możliwości, to, że jest złożona, niekoniecznie jest błędem. Może po prostu odzwierciedlać złożoność/zmienność danego zadania. –