From 8462d7cc42f64c4584661188966b14f905aa3da1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= <zebob.m@gmail.com>
Date: Mon, 14 Feb 2022 00:40:44 +0100
Subject: [PATCH] Use CodeType.replace() in copycode for Python > 3.8
Fix #135
---
automat/_introspection.py | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/automat/_introspection.py b/automat/_introspection.py
index 3f7307d..0ce9037 100644
--- a/automat/_introspection.py
+++ b/automat/_introspection.py
@@ -6,22 +6,24 @@ 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)
-
+ if hasattr(code, "replace"):
+ return template.replace(**{"co_" + k : v for k, v in changes.items()})
+ else:
+ 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):
--
2.34.1