2015-04-17 7 views
5

मैं कुछ इस तरह हैं:मैं एक लूप के साथ संदर्भ प्रबंधक कैसे बना सकता हूं?

from contextlib import contextmanager 

@contextmanager 
def loop(seq): 
    for i in seq: 
     try: 
      do_setup(i) 
      yield # with body executes here 
      do_cleanup(i) 
     except CustomError as e: 
      print(e) 

with loop([1,2,3]): 
    do_something_else() 
    do_whatever() 

लेकिन contextmanager काम नहीं करता है, क्योंकि यह जनरेटर ठीक एक बार उपज के लिए उम्मीद है।

कारण मैं इसे क्यों चाहता हूं क्योंकि मैं मूल रूप से लूप के लिए अपना खुद का कस्टम बनाना चाहता हूं। मेरे पास एक संशोधित आईपीथन है जिसका प्रयोग परीक्षण उपकरणों को नियंत्रित करने के लिए किया जाता है। यह स्पष्ट रूप से एक पूर्ण पायथन आरईपीएल है, लेकिन अधिकांश समय उपयोगकर्ता केवल पूर्वनिर्धारित कार्यों (बैश प्रॉम्प्ट के समान) को कॉल कर रहा है, और उपयोगकर्ता को प्रोग्रामर होने या पाइथन से परिचित होने की उम्मीद नहीं है। प्रत्येक पुनरावृत्ति के लिए सेटअप/क्लीनअप और अपवाद हैंडलिंग के साथ कुछ मनमानी कोड पर लूप करने का एक तरीका होना चाहिए, और यह उपरोक्त के रूप में टाइप करने के लिए सरल होना चाहिए।

उत्तर

7

मुझे लगता है कि एक जनरेटर बेहतर यहाँ काम करता है:

def loop(seq): 
    for i in seq: 
     try: 
      print('before') 
      yield i # with body executes here 
      print('after') 
     except CustomError as e: 
      print(e) 

for i in loop([1,2,3]): 
    print(i) 
    print('code') 

दे देंगे:

before 
1 
code 
after 
before 
2 
code 
after 
before 
3 
code 
after 

अजगर में प्रवेश करती है और केवल एक बार एक with ब्लॉक बाहर निकल जाता है, ताकि आप में प्रवेश/बाहर निकलें पूर्णांक तर्क नहीं हो सकता कदम जो बार-बार किया जाएगा।

+0

मुझे पता था कि यह ऐसा कुछ आसान होगा। धन्यवाद! – jpkotta

संबंधित मुद्दे