मैं एक साधारण संदर्भ प्रबंधक अजगर में इकाई परीक्षण से निपटने के लिए लिखा था (और संदर्भ प्रबंधकों को जानने के लिए प्रयास करने के लिए):अजगर ... कस्टम संदर्भ प्रबंधक के लिए के रूप में
class TestContext(object):
test_count=1
def __init__(self):
self.test_number = TestContext.test_count
TestContext.test_count += 1
def __enter__(self):
pass
def __exit__(self, exc_type, exc_value, exc_traceback):
if exc_value == None:
print 'Test %d passed' %self.test_number
else:
print 'Test %d failed: %s' %(self.test_number, exc_value)
return True
मैं एक परीक्षण लिखते हैं इस प्रकार है, सबकुछ ठीक काम करता है।
test = TestContext()
with test:
print 'running test %d....' %test.test_number
raise Exception('this test failed')
हालांकि, अगर मैं इसका उपयोग करने की कोशिश करता हूं ... जैसा कि मुझे TestContext() ऑब्जेक्ट का संदर्भ नहीं मिलता है। इसे चलाना:
with TestContext() as t:
print t.test_number
अपवाद 'NoneType' object has no attribute 'test_number'
उठाता है।
मैं गलत कहां जा रहा हूं?
ध्यान दें कि संदर्भ प्रबंधक के लिए 'स्वयं' वापस करने के लिए कोई * आवश्यकता * नहीं है। यह एक बहुत ही आसान डिफ़ॉल्ट है, ताकि आप 'प्रबंधक' कथन में संदर्भ प्रबंधक बना सकें, लेकिन संदर्भ प्रबंधक '__enter__' से जो कुछ भी पसंद करता है उसे वापस करने के लिए स्वतंत्र है। ओपी के विशिष्ट उपयोग के लिए, जहां 'टेस्टकॉन्टेक्स्ट() '' कथन' में बनाया गया है, 'स्वयं' लौटने का वास्तव में जाने का तरीका है। –
@MartijnPieters आप पूरी तरह से सही हैं। मैंने इसके बारे में एक अस्वीकरण जोड़ा। –