ho scritto un semplice gestore di contesto in Python per la gestione di unit test (e cercare di imparare i gestori di contesto):Python con ... come per il contesto direttore personalizzato
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
Se scrivo un test come segue, tutto funziona bene.
test = TestContext()
with test:
print 'running test %d....' %test.test_number
raise Exception('this test failed')
Tuttavia, se si tenta di utilizzare con ... come, non ottengo un riferimento all'oggetto TestContext(). Esecuzione di questo:
with TestContext() as t:
print t.test_number
Solleva l'eccezione 'NoneType' object has no attribute 'test_number'
.
Dove sto andando male?
Si noti che non esiste * requisito * per un gestore di contesto restituire 'self'. È un valore predefinito molto utile, in modo che sia possibile creare il gestore di contesto nell'istruzione 'with', ma un gestore di contesto è libero di restituire ciò che gli piace da' __enter__'. Per il caso specifico dell'OP, in cui 'TestContext()' viene creato nell'istruzione 'with', restituire' self 'è davvero la strada da percorrere. –
@MartijnPieters Hai completamente ragione. Ho aggiunto un disclaimer a riguardo. –