tôi thấy người khác đã chỉ ra tuổi của tôi "gán và thiết lập" Cookbook công thức, mà tóm lại trong phiên bản đơn giản nhất để:
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()
Tuy nhiên, điều này đã được dự định chủ yếu để giảm bớt phiên giữa Python và ngôn ngữ mà bài tập được hỗ trợ trực tiếp trong if
hoặc while
.Nếu bạn có "hàng trăm" như vậy check-and-trở lại trong một thác, đó là nhiều tốt hơn để làm điều gì đó hoàn toàn khác nhau:
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
hoặc thậm chí một cái gì đó giống như
return next(x for x in (f(y) for f in hundreds) if x)
nếu nó OK để nhận ngoại lệ StopIteration nếu không có biến vị ngữ nào được thỏa mãn hoặc
return next((x for x in (f(y) for f in hundreds) if x)), None)
nếu None
là giá trị trả về thích hợp khi không có vị từ được thỏa mãn , v.v.
Hầu như không thay đổi, sử dụng (hoặc thậm chí mong muốn ;-) mẹo/non-idiom là một "mùi thiết kế" cho thấy tìm kiếm một cách tiếp cận khác biệt hơn và Pythonic - trường hợp Holder
là chính xác là trường hợp đặc biệt mà tôi đã thiết kế nó, ví dụ, trường hợp bạn muốn giữ sự tương ứng chặt chẽ giữa mã Python và một số không Python (bạn đang chuyển ngữ một thuật toán tham chiếu trong Python và muốn nó hoạt động trước khi refactoring nó vào một hình thức Pythonic hơn, hoặc bạn đang viết Python như là một mẫu thử nghiệm sẽ được chuyển thành C++, C#, Java, vv, một khi nó hoạt động hiệu quả).
Tại sao bạn muốn một lớp lót? Các chương trình không tốt hơn vì chúng có ít dòng hơn. –
Giống như http://stackoverflow.com/questions/1513436/what-should-i-use-instead-of-assignment-in-an-expression-in-python/1513987#1513987 – PaulMcG
Bạn có 100 trong số này? Bạn sẽ không xảy ra được viết một phân tích cú pháp, phải không? Xem danh sách này (http://nedbatchelder.com/text/python-parsers.html) từ trang web của Ned Batchelder. – PaulMcG