From 8462d7cc42f64c4584661188966b14f905aa3da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= 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