Я вижу, кто-то уже указывал на мой старый «назначить и установить» Cookbook рецепт, который сводится в простейшем варианте для:
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()
Однако, это было предназначено главным образом для облегчения транслитерации между Python и языки, где присвоение напрямую поддерживается в if
или while
.Если у вас есть «сотни» такой регистрации и возврате в каскаде, это гораздо лучше сделать что-то совершенно другое:
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
или даже что-то вроде
return next(x for x in (f(y) for f in hundreds) if x)
, если это нормально получить исключение StopIteration если не предикат не удовлетворен, или
return next((x for x in (f(y) for f in hundreds) if x)), None)
если None
является правильным возвращаемым значением, если не предикат не удовлетворен И т.д.
Почти всегда, используя (или даже желая ;-) Holder
трик/не-идиомы является «дизайн запах», который предлагает искать другой, более Pythonic подход - тот случай, когда Holder
является оправданным является именно тот особый случай, для которого я его разработал, т. е. случай, когда вы хотите поддерживать близкое соответствие между кодом Python и некоторым не-Python (вы транслитерируете эталонный алгоритм в Python и хотите, чтобы он работал сначала, прежде чем реорганизовывать его в более питоническую форму, или вы пишите Python в качестве прототипа, который будет транслитерирован в C++, C#, Java и т. д., как только он будет работать эффективно).
Для чего нужен однострочный вкладыш? Программы не улучшаются, потому что у них меньше строк. –
То же, что http://stackoverflow.com/questions/1513436/what-should-i-use-instead-of-assignment-in-an-expression-in-python/1513987#1513987 – PaulMcG
У вас есть 100 из них? Вы бы не стали писать парсер, не так ли? См. Этот список (http://nedbatchelder.com/text/python-parsers.html) с веб-сайта Ned Batchelder. – PaulMcG