Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/structlog/_greenlets.py: 21%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# SPDX-License-Identifier: MIT OR Apache-2.0
2# This file is dual licensed under the terms of the Apache License, Version
3# 2.0, and the MIT License. See the LICENSE file in the root of this
4# repository for complete details.
6"""
7greenlet-specific code that pretends to be a `threading.local`.
9Fails to import if not running under greenlet.
10"""
12from __future__ import annotations
14from typing import Any
15from weakref import WeakKeyDictionary
17from greenlet import getcurrent
20class GreenThreadLocal:
21 """
22 threading.local() replacement for greenlets.
23 """
25 def __init__(self) -> None:
26 self.__dict__["_weakdict"] = WeakKeyDictionary()
28 def __getattr__(self, name: str) -> Any:
29 key = getcurrent()
30 try:
31 return self._weakdict[key][name]
32 except KeyError:
33 raise AttributeError(name) from None
35 def __setattr__(self, name: str, val: Any) -> None:
36 key = getcurrent()
37 self._weakdict.setdefault(key, {})[name] = val
39 def __delattr__(self, name: str) -> None:
40 key = getcurrent()
41 try:
42 del self._weakdict[key][name]
43 except KeyError:
44 raise AttributeError(name) from None