aboutsummaryrefslogtreecommitdiffstats
path: root/src/cryptography/utils.py
diff options
context:
space:
mode:
authorAlex Gaynor <alex.gaynor@gmail.com>2017-07-08 21:50:01 -0400
committerPaul Kehrer <paul.l.kehrer@gmail.com>2017-07-08 20:50:01 -0500
commit0c9aed91697c5bc1eb16c2254406149e2395fdae (patch)
treeb0ea4d4d81357e0aab15d70f1823486aebfbb9a8 /src/cryptography/utils.py
parentae487bb5c70516505653a7884b5be5de26c5d96e (diff)
downloadcryptography-0c9aed91697c5bc1eb16c2254406149e2395fdae.tar.gz
cryptography-0c9aed91697c5bc1eb16c2254406149e2395fdae.tar.bz2
cryptography-0c9aed91697c5bc1eb16c2254406149e2395fdae.zip
Fixed #3747 -- cache extensions on x.509 objects (#3769)
* Fixed #3747 -- cache extensions on x.509 objects * be kind to cpython, save a dict lookup * flake8 * changelog
Diffstat (limited to 'src/cryptography/utils.py')
-rw-r--r--src/cryptography/utils.py14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cryptography/utils.py b/src/cryptography/utils.py
index d28dc71d..efb12e21 100644
--- a/src/cryptography/utils.py
+++ b/src/cryptography/utils.py
@@ -145,3 +145,17 @@ def deprecated(value, module_name, message, warning_class):
if not isinstance(module, _ModuleWithDeprecations):
sys.modules[module_name] = _ModuleWithDeprecations(module)
return _DeprecatedValue(value, message, warning_class)
+
+
+def cached_property(func):
+ cached_name = "_cached_{0}".format(func)
+ sentinel = object()
+
+ def inner(instance):
+ cache = getattr(instance, cached_name, sentinel)
+ if cache is not sentinel:
+ return cache
+ result = func(instance)
+ setattr(instance, cached_name, result)
+ return result
+ return property(inner)