|
11 | 11 | """
|
12 | 12 |
|
13 | 13 | import inspect
|
| 14 | +import sys |
14 | 15 | import threading
|
15 | 16 |
|
16 | 17 |
|
@@ -196,7 +197,7 @@ class will have its own stack and will be scoped independent of any
|
196 | 197 |
|
197 | 198 | _Scoped__is_open = False
|
198 | 199 | _Scoped__is_used = False
|
199 |
| - _Scoped__open_site = None |
| 200 | + _Scoped__open_site_frame = None |
200 | 201 |
|
201 | 202 | def open(self, call_site_level=1):
|
202 | 203 | """
|
@@ -238,9 +239,11 @@ def open(self, call_site_level=1):
|
238 | 239 | self._Scoped__is_open = True
|
239 | 240 | self._Scoped__is_used = True
|
240 | 241 |
|
241 |
| - stack = inspect.stack() |
242 |
| - if len(stack) > call_site_level: |
243 |
| - self._Scoped__open_site = stack[call_site_level] |
| 242 | + try: |
| 243 | + self._Scoped__open_site_frame = sys._getframe(call_site_level) |
| 244 | + except ValueError: |
| 245 | + # No frame found, skip |
| 246 | + pass |
244 | 247 |
|
245 | 248 | return self
|
246 | 249 |
|
@@ -286,8 +289,8 @@ def is_open(self):
|
286 | 289 | return self._Scoped__is_open
|
287 | 290 |
|
288 | 291 | @property
|
289 |
| - def open_site(self): |
290 |
| - return self._Scoped__open_site |
| 292 | + def open_site(self) -> inspect.Traceback: |
| 293 | + return inspect.getframeinfo(self._Scoped__open_site_frame) |
291 | 294 |
|
292 | 295 | @property
|
293 | 296 | def is_used(self):
|
@@ -350,7 +353,7 @@ def clear(cls):
|
350 | 353 | def format_trace_entry(self):
|
351 | 354 | if self.open_site:
|
352 | 355 | return "{0}({1}) opened at {2}:{3}\n".format(
|
353 |
| - self.__class__.__name__, id(self), self.open_site[1], self.open_site[2] |
| 356 | + self.__class__.__name__, id(self), self.open_site[0], self.open_site[1] |
354 | 357 | )
|
355 | 358 | else:
|
356 | 359 | return "{0}({1}) opened somewhere\n".format(
|
|
0 commit comments