widzę ktoś inny już wskazał na mój stary „przypisać i ustaw” Cookbook przepis, który sprowadza się w swej najprostszej wersji do:
class Holder(object):
def set(self, value):
self.value = value
return value
def get(self):
return self.value
h = Holder()
...
if h.set(isBig(y)): return h.get()
Jednak ten był przeznaczony głównie do złagodzenia transliteracji między Python i języki, w których przypisanie jest obsługiwane bezpośrednio w if
lub while
.Jeśli masz „setki” takiego wyboru iz powrotem w kaskadzie, to znacznie lepiej zrobić coś zupełnie innego:
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
lub nawet coś podobnego
return next(x for x in (f(y) for f in hundreds) if x)
jeśli jest OK, aby uzyskać wyjątek StopIteration jeśli nie predykat jest spełniony, lub
return next((x for x in (f(y) for f in hundreds) if x)), None)
jeśli None
jest właściwa wartość zwracana, gdy orzeczenie nie jest spełniony , itp.
Prawie niezmiennie, używając (lub nawet chcąc ;-) sztuczka/non-idiom Holder
jest "zapachem projektowym", który sugeruje szukanie innego i bardziej Pythonicznego podejścia - jedyny przypadek, w którym Holder
jest usprawiedliwienie jest dokładnie tym specjalnym przypadkiem, dla którego go zaprojektowałem, tj. przypadkiem, w którym chcesz zachować ścisłą zgodność między kodem Pythona a jakimś nie-Pythonem (transliteracja algorytmu referencyjnego w Pythonie i chcesz, aby działał najpierw przed refaktoryzacją w bardziej Pythonową formę, lub pisząc Pythona jako prototyp, który będzie transliterowany do C++, C#, Java itd., kiedy będzie działać efektywnie).
Dlaczego chcesz jedno-liniowy? Programy nie są lepsze, ponieważ mają mniej linii. –
To samo, co http://stackoverflow.com/questions/1513436/what-może--używać-instead-of-assignment-in-an-expression-in-python/1513987#1513987 – PaulMcG
Masz ich 100? Nie napisałbyś parsera, prawda? Zobacz tę listę (http://nedbatchelder.com/text/python-parsers.html) ze strony Neda Batcheldera. – PaulMcG