aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Automat/py2/automat/_introspection.py
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2023-11-26 18:16:14 +0300
committershmel1k <shmel1k@ydb.tech>2023-11-26 18:43:30 +0300
commitb8cf9e88f4c5c64d9406af533d8948deb050d695 (patch)
tree218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Automat/py2/automat/_introspection.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Automat/py2/automat/_introspection.py')
-rw-r--r--contrib/python/Automat/py2/automat/_introspection.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/contrib/python/Automat/py2/automat/_introspection.py b/contrib/python/Automat/py2/automat/_introspection.py
new file mode 100644
index 0000000000..3f7307d8df
--- /dev/null
+++ b/contrib/python/Automat/py2/automat/_introspection.py
@@ -0,0 +1,45 @@
+"""
+Python introspection helpers.
+"""
+
+from types import CodeType as code, FunctionType as function
+
+
+def copycode(template, changes):
+ names = [
+ "argcount", "nlocals", "stacksize", "flags", "code", "consts",
+ "names", "varnames", "filename", "name", "firstlineno", "lnotab",
+ "freevars", "cellvars"
+ ]
+ if hasattr(code, "co_kwonlyargcount"):
+ names.insert(1, "kwonlyargcount")
+ if hasattr(code, "co_posonlyargcount"):
+ # PEP 570 added "positional only arguments"
+ names.insert(1, "posonlyargcount")
+ values = [
+ changes.get(name, getattr(template, "co_" + name))
+ for name in names
+ ]
+ return code(*values)
+
+
+
+def copyfunction(template, funcchanges, codechanges):
+ names = [
+ "globals", "name", "defaults", "closure",
+ ]
+ values = [
+ funcchanges.get(name, getattr(template, "__" + name + "__"))
+ for name in names
+ ]
+ return function(copycode(template.__code__, codechanges), *values)
+
+
+def preserveName(f):
+ """
+ Preserve the name of the given function on the decorated function.
+ """
+ def decorator(decorated):
+ return copyfunction(decorated,
+ dict(name=f.__name__), dict(name=f.__name__))
+ return decorator