मैं एक with
ब्लॉक में डेटाबेस लेनदेन के लिए तर्क संपुटित करने के लिए देख रहा हूँ; एक लेनदेन में कोड लपेटना और विभिन्न अपवादों को संभालना (मुद्दों को लॉक करना)। यह काफी आसान है, हालांकि मैं कुछ अपवादों के बाद ब्लॉक ब्लॉक को पुनः लोड करने के लिए ब्लॉक को भी समाहित करना चाहता हूं। मैं संदर्भ प्रबंधक में इसे अच्छी तरह से पैकेज करने का कोई तरीका नहीं देख सकता।`with` ब्लॉक में encapsulating पुनर्प्रयास
क्या with
कथन के भीतर कोड दोहराना संभव है?
मैं इसे जो वास्तव में साफ है, इस के रूप में के रूप में बस का उपयोग करना चाहते हैं।
def do_work():
...
# This is ideal!
with transaction(retries=3):
# Atomic DB statements
...
...
मैं वर्तमान में एक डेकोरेटर के साथ इस से निपटने हूँ, लेकिन मैं संदर्भ प्रबंधक (या दोनों वास्तव में), तो मैं बजाय with
ब्लॉक में कोड की कुछ लाइनें रैप करने के लिए चुन सकते हैं की पेशकश करना पसंद करते हैं एक इनलाइन समारोह एक डेकोरेटर में लिपटे है, जो है जो मैं इस समय कर की:
with transaction(_perform_in_transaction, retries=3) as _perf:
_perf()
के लिए:
def do_work():
...
# This is not ideal!
@transaction(retries=3)
def _perform_in_transaction():
# Atomic DB statements
...
_perform_in_transaction()
...
http://docs.python.org/release/2.5/whatsnew/pep-343.html ऐसा लगता है कि संदर्भ प्रबंधक को कार्यान्वित करने के तरीके के उदाहरण हैं। – Vlad