@@ -122,13 +122,6 @@ class Outcome(abc.ABC, Generic[ValueT]):
122
122
hashable.
123
123
124
124
"""
125
- _unwrapped : bool = attr .ib (default = False , eq = False , init = False )
126
-
127
- def _set_unwrapped (self ) -> None :
128
- if self ._unwrapped :
129
- raise AlreadyUsedError
130
- object .__setattr__ (self , '_unwrapped' , True )
131
-
132
125
@abc .abstractmethod
133
126
def unwrap (self ) -> ValueT :
134
127
"""Return or raise the contained value or exception.
@@ -177,16 +170,24 @@ def __repr__(self) -> str:
177
170
return f'Value({ self .value !r} )'
178
171
179
172
def unwrap (self ) -> ValueT :
180
- self ._set_unwrapped ()
181
- return self .value
173
+ try :
174
+ v = self .value
175
+ except AttributeError :
176
+ pass
177
+ else :
178
+ object .__delattr__ (self , "value" )
179
+ try :
180
+ return v
181
+ finally :
182
+ del v
183
+ raise AlreadyUsedError
182
184
183
185
def send (self , gen : Generator [ResultT , ValueT , object ]) -> ResultT :
184
- self ._set_unwrapped ()
185
- return gen .send (self .value )
186
+ return gen .send (self .unwrap ())
186
187
187
188
async def asend (self , agen : AsyncGenerator [ResultT , ValueT ]) -> ResultT :
188
189
self ._set_unwrapped ()
189
- return await agen .asend (self .value )
190
+ return await agen .asend (self .unwrap () )
190
191
191
192
192
193
@final
@@ -204,11 +205,23 @@ class Error(Outcome[NoReturn]):
204
205
def __repr__ (self ) -> str :
205
206
return f'Error({ self .error !r} )'
206
207
208
+ def _unwrap_error (self ) -> BaseException :
209
+ try :
210
+ v = self .error
211
+ except AttributeError :
212
+ pass
213
+ else :
214
+ object .__delattr__ (self , "error" )
215
+ try :
216
+ return v
217
+ finally :
218
+ del v
219
+ raise AlreadyUsedError
220
+
207
221
def unwrap (self ) -> NoReturn :
208
- self ._set_unwrapped ()
209
222
# Tracebacks show the 'raise' line below out of context, so let's give
210
223
# this variable a name that makes sense out of context.
211
- captured_error = self .error
224
+ captured_error = self ._unwrap_error ()
212
225
try :
213
226
raise captured_error
214
227
finally :
@@ -227,12 +240,10 @@ def unwrap(self) -> NoReturn:
227
240
del captured_error , self
228
241
229
242
def send (self , gen : Generator [ResultT , NoReturn , object ]) -> ResultT :
230
- self ._set_unwrapped ()
231
- return gen .throw (self .error )
243
+ return gen .throw (self ._unwrap_error ())
232
244
233
245
async def asend (self , agen : AsyncGenerator [ResultT , NoReturn ]) -> ResultT :
234
- self ._set_unwrapped ()
235
- return await agen .athrow (self .error )
246
+ return await agen .athrow (self ._unwrap_error ())
236
247
237
248
238
249
# A convenience alias to a union of both results, allowing exhaustiveness checking.
0 commit comments