Po pierwsze nie wiem, czy to bardzo mądre. Powiedzmy, że dana osoba dzwoni na przykład:
f(*((1,4),(2,5)))
Jak widać krotka zawiera dwa elementy. Ale teraz z jakiegoś powodu, osoba nazywa to tylko jeden element (bo na przykład generator nie generowane dwa elementy):
f(*((1,4),))
Następnie użytkownik prawdopodobnie chcesz, aby funkcja zgłosić to, ale teraz to będzie po prostu ją zaakceptuj (co może prowadzić do skomplikowanego i nieoczekiwanego zachowania). Dobra drukowanie elementów oczywiście nie zaszkodzi. Ale w ogólnym przypadku konsekwencje mogą być bardziej poważne.
Niemniej elegancki sposób to zrobić czyni prostą dekorator że najpierw sprawdza, czy jeden element jest zasilany sprawdza, czy jeden element krotki jest karmione, a jeśli tak rozszerza go:
def one_tuple(f):
def g(*args):
if len(args) == 1 and isinstance(args[0],tuple):
return f(*args[0])
else:
return f(*args)
return g
i stosować go Aplikacje f
:
@one_tuple
def f(*args):
if len(args) == 2:
print args[0],args[1]
else:
raise Exception("wrong number of arguments")
dekorator one_tuple
ten sposób sprawdza, czy jeden krotka jest podawany, a jeśli tak rozpakowuje to dla ciebie b przed przekazaniem go do swojej funkcji f
.
Wskutek f
nie musi wziąć pod uwagę przypadek krotny: będzie zawsze być karmione rozszerzonych argumentów i obsługiwać te (oczywiście odwrotnie można zrobić również).
Zaletą definiowania dekoratora jest jego ponowne użycie: można zastosować ten dekorator do wszystkich funkcji (i tym samym ułatwić ich realizację).
Co (oprócz wcięcia) jest nie tak z tym, co napisałeś? –
Twierdzę, że prawdopodobnie nie jest rozsądne, aby twoja funkcja była polimorficzna w ten sposób ... Ale inni mogą się z tym nie zgodzić. – mgilson
Aby echo @mgilson, jeśli twoja funkcja oczekuje dwóch wartości, zadeklaruj, że przyjmuje dwie wartości. Jeśli osoba dzwoniąca ma 2-krotne, może zawsze użyć 'f (* (1,2)). Nie przechylaj się w tył, aby dostosować się do przewidywanego użycia, jeśli zasłania to oczekiwane użycie. – chepner