This is an automated email from the ASF dual-hosted git repository.

tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new 795fc32d99 [SCRIPT] Bump Python minimum version to 3.9 and update AST 
compatibility (#18086)
795fc32d99 is described below

commit 795fc32d99f4fea24c88b3e0c5f785a0d318de10
Author: Siyuan Feng <[email protected]>
AuthorDate: Tue Jun 24 01:04:07 2025 +0800

    [SCRIPT] Bump Python minimum version to 3.9 and update AST compatibility 
(#18086)
    
    - Set Python minimal version to 3.9 as Python 3.8 has reached end of life
    - Update AST handling to match Python 3.9+ API changes
    - Fix deprecation warning: "Support for arbitrary keyword arguments is 
deprecated and will be removed in Python 3.15"
    - Update TVMScript parser components to use modern AST interfaces
    - Adjust linting and test infrastructure for Python 3.9+ compatibility
---
 python/tvm/base.py                           |   9 +-
 python/tvm/script/parser/core/diagnostics.py |   8 +-
 python/tvm/script/parser/core/doc.py         | 146 ---------
 python/tvm/script/parser/core/doc_core.py    | 422 +++++++++++----------------
 python/tvm/script/parser/core/evaluator.py   |   9 +-
 python/tvm/script/parser/tir/parser.py       |   8 +-
 tests/lint/filter_untracked.py               |   5 +-
 tests/python/relax/test_tvmscript_parser.py  |   3 -
 tests/scripts/ci.py                          |  10 +-
 9 files changed, 186 insertions(+), 434 deletions(-)

diff --git a/python/tvm/base.py b/python/tvm/base.py
index 13b4fc8d44..63e097999c 100644
--- a/python/tvm/base.py
+++ b/python/tvm/base.py
@@ -26,8 +26,8 @@ from . import libinfo
 # ----------------------------
 # Python3 version.
 # ----------------------------
-if not (sys.version_info[0] >= 3 and sys.version_info[1] >= 8):
-    PY3STATEMENT = "The minimal Python requirement is Python 3.8"
+if not (sys.version_info[0] >= 3 and sys.version_info[1] >= 9):
+    PY3STATEMENT = "The minimal Python requirement is Python 3.9"
     raise Exception(PY3STATEMENT)
 
 # ----------------------------
@@ -38,9 +38,8 @@ if not (sys.version_info[0] >= 3 and sys.version_info[1] >= 
8):
 def _load_lib():
     """Load libary by searching possible path."""
     lib_path = libinfo.find_lib_path()
-    # The dll search path need to be added explicitly in
-    # windows after python 3.8
-    if sys.platform.startswith("win32") and sys.version_info >= (3, 8):
+    # The dll search path need to be added explicitly in windows
+    if sys.platform.startswith("win32"):
         for path in libinfo.get_dll_directories():
             os.add_dll_directory(path)
     lib = ctypes.CDLL(lib_path[0], ctypes.RTLD_GLOBAL)
diff --git a/python/tvm/script/parser/core/diagnostics.py 
b/python/tvm/script/parser/core/diagnostics.py
index 2767a97f60..4df2d193fe 100644
--- a/python/tvm/script/parser/core/diagnostics.py
+++ b/python/tvm/script/parser/core/diagnostics.py
@@ -220,10 +220,10 @@ class Diagnostics:
         level : diagnostics.DiagnosticLevel
             The diagnostic level.
         """
-        lineno = node.lineno or 1
-        col_offset = node.col_offset or self.source.start_column
-        end_lineno = node.end_lineno or lineno
-        end_col_offset = node.end_col_offset or col_offset
+        lineno = getattr(node, "lineno", 1)
+        col_offset = getattr(node, "col_offset", self.source.start_column)
+        end_lineno = getattr(node, "end_lineno", lineno)
+        end_col_offset = getattr(node, "end_col_offset", col_offset)
         lineno += self.source.start_line - 1
         end_lineno += self.source.start_line - 1
         col_offset += self.source.start_column + 1
diff --git a/python/tvm/script/parser/core/doc.py 
b/python/tvm/script/parser/core/doc.py
index 8b5c46e5a6..74174f0667 100644
--- a/python/tvm/script/parser/core/doc.py
+++ b/python/tvm/script/parser/core/doc.py
@@ -18,7 +18,6 @@
 
 import ast
 import inspect
-import sys
 import typing
 from collections import defaultdict
 
@@ -319,149 +318,4 @@ def _register_default():
             )
 
 
-def _py_version() -> typing.Tuple[int, int]:
-    return (sys.version_info.major, sys.version_info.minor)
-
-
-def _register_constant_handling():
-    if _py_version() not in [(3, 6), (3, 7)]:
-        return
-
-    def as_constant(f) -> doc.Constant:
-        def to_doc_func(x: ast.AST) -> doc.Constant:
-            return doc.Constant(
-                value=getattr(x, f) if isinstance(f, str) else f(x),
-                kind=None,
-                lineno=x.lineno,
-                col_offset=x.col_offset,
-                end_lineno=x.lineno,
-                end_col_offset=x.col_offset,
-            )
-
-        return to_doc_func
-
-    register_to_doc("Str")(as_constant("s"))
-    register_to_doc("NameConstant")(as_constant("value"))
-    register_to_doc("Num")(as_constant("n"))
-    register_to_doc("Bytes")(as_constant("s"))
-    register_to_doc("Ellipsis")(as_constant(lambda _: ...))
-
-
-def _register_subscription_handling():
-    if _py_version() >= (3, 9):
-        return
-
-    def subscript_to_doc(x: ast.Subscript) -> doc.Subscript:
-        if isinstance(x.slice, ast.Slice):
-            return doc.Subscript(
-                value=to_doc(x.value),
-                slice=doc.Slice(
-                    lower=to_doc(x.slice.lower),
-                    upper=to_doc(x.slice.upper),
-                    step=to_doc(x.slice.step),
-                    lineno=getattr(x.slice, "lineno", None),
-                    col_offset=getattr(x.slice, "col_offset", None),
-                    end_lineno=getattr(x.slice, "end_lineno", None),
-                    end_col_offset=getattr(x.slice, "end_col_offset", None),
-                ),
-                ctx=to_doc(x.ctx),
-                lineno=getattr(x, "lineno", None),
-                col_offset=getattr(x, "col_offset", None),
-                end_lineno=getattr(x, "end_lineno", None),
-                end_col_offset=getattr(x, "end_col_offset", None),
-            )
-        if isinstance(x.slice, ast.ExtSlice):
-            return doc.Subscript(
-                value=to_doc(x.value),
-                slice=doc.Tuple(
-                    elts=[to_doc(i) for i in x.slice.dims],
-                    ctx=doc.Load(
-                        lineno=None,
-                        col_offset=None,
-                        end_lineno=None,
-                        end_col_offset=None,
-                    ),
-                    lineno=getattr(x, "lineno", None),
-                    col_offset=getattr(x, "col_offset", None),
-                    end_lineno=getattr(x, "end_lineno", None),
-                    end_col_offset=getattr(x, "end_col_offset", None),
-                ),
-                ctx=to_doc(x.ctx),
-                lineno=getattr(x, "lineno", None),
-                col_offset=getattr(x, "col_offset", None),
-                end_lineno=getattr(x, "end_lineno", None),
-                end_col_offset=getattr(x, "end_col_offset", None),
-            )
-        if isinstance(x.slice, ast.Index):
-            return doc.Subscript(
-                value=to_doc(x.value),
-                slice=to_doc(x.slice.value),
-                ctx=to_doc(x.ctx),
-                lineno=getattr(x, "lineno", None),
-                col_offset=getattr(x, "col_offset", None),
-                end_lineno=getattr(x, "end_lineno", None),
-                end_col_offset=getattr(x, "end_col_offset", None),
-            )
-        raise TypeError(f"Unknown subscript type: {type(x.slice)}")
-
-    def subscript_from_doc(x: doc.Subscript) -> ast.Subscript:
-        if isinstance(x.slice, doc.Slice):
-            result = ast.Subscript(
-                value=from_doc(x.value),
-                slice=from_doc(x.slice),
-                ctx=from_doc(x.ctx),
-            )
-        elif isinstance(x.slice, doc.Tuple):
-
-            def remap_dim(doc_item: doc.Expr) -> ast.Expr:
-                ast_item = from_doc(doc_item)
-                if isinstance(ast_item, (ast.Index, ast.Slice)):
-                    return ast_item
-                return ast.Index(value=ast_item)
-
-            # ast.ExtSlice requires a non-empty list of dims, and each dim 
must be either
-            # a Slice or an Index.
-            if x.slice.elts:
-                ast_slice = ast.ExtSlice(dims=[*map(remap_dim, x.slice.elts)])
-            else:
-                ast_slice = ast.Index(value=ast.Tuple(elts=[], 
ctx=from_doc(x.ctx)))
-            result = ast.Subscript(value=from_doc(x.value), slice=ast_slice, 
ctx=from_doc(x.ctx))
-        else:
-            result = ast.Subscript(
-                value=from_doc(x.value),
-                slice=ast.Index(value=from_doc(x.slice)),
-                ctx=from_doc(x.ctx),
-            )
-        result.lineno = x.lineno
-        result.col_offset = x.col_offset
-        result.end_lineno = x.end_lineno
-        result.end_col_offset = x.end_col_offset
-        return result
-
-    register_to_doc("Subscript")(subscript_to_doc)
-    register_from_doc("Subscript")(subscript_from_doc)
-
-
-def _register_index_handling():
-    if _py_version() >= (3, 9):
-        return
-
-    def index_to_doc(x: ast.Index) -> doc.Expr:
-        return to_doc(x.value)
-
-    def index_from_doc(x: doc.Expr) -> ast.Index:
-        result = ast.Index(value=from_doc(x), ctx=from_doc(x.ctx))
-        result.lineno = x.lineno
-        result.col_offset = x.col_offset
-        result.end_lineno = x.end_lineno
-        result.end_col_offset = x.end_col_offset
-        return result
-
-    register_to_doc("Index")(index_to_doc)
-    register_from_doc("Index")(index_from_doc)
-
-
 _register_default()
-_register_constant_handling()
-_register_subscription_handling()
-_register_index_handling()
diff --git a/python/tvm/script/parser/core/doc_core.py 
b/python/tvm/script/parser/core/doc_core.py
index 37e6c18253..344ac8cf87 100644
--- a/python/tvm/script/parser/core/doc_core.py
+++ b/python/tvm/script/parser/core/doc_core.py
@@ -17,45 +17,44 @@
 # pylint: disable=redefined-outer-name,missing-docstring,invalid-name
 # pylint: disable=useless-super-delegation,redefined-builtin
 # pylint: disable=too-few-public-methods,too-many-arguments
+
+
+# minimal python version is 3.9
 class AST:
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
+    def __init__(self):
         super().__init__()
-        self.lineno = lineno
-        self.col_offset = col_offset
-        self.end_lineno = end_lineno
-        self.end_col_offset = end_col_offset
 
 
 class mod(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Module(mod):
-    _FIELDS = ["body", "lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = ["body"]
 
-    def __init__(self, body, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, body):
+        super().__init__()
         self.body = body
 
 
 class Interactive(mod):
-    _FIELDS = ["body", "lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = ["body"]
 
-    def __init__(self, body, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, body):
+        super().__init__()
         self.body = body
 
 
 class Expression(mod):
-    _FIELDS = ["body", "lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = ["body"]
 
-    def __init__(self, body, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, body):
+        super().__init__()
         self.body = body
 
 
@@ -63,7 +62,11 @@ class stmt(AST):
     _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
 
     def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+        super().__init__()
+        self.lineno = lineno
+        self.col_offset = col_offset
+        self.end_lineno = end_lineno
+        self.end_col_offset = end_col_offset
 
 
 class FunctionDef(stmt):
@@ -345,7 +348,11 @@ class expr(AST):
     _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
 
     def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+        super().__init__()
+        self.lineno = lineno
+        self.col_offset = col_offset
+        self.end_lineno = end_lineno
+        self.end_col_offset = end_col_offset
 
 
 class BoolOp(expr):
@@ -541,39 +548,6 @@ class Attribute(expr):
         self.ctx = ctx
 
 
-class slice(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-
-
-class Slice(slice):
-    _FIELDS = ["lower", "upper", "step", "lineno", "col_offset", "end_lineno", 
"end_col_offset"]
-
-    def __init__(self, lower, upper, step, lineno, col_offset, end_lineno, 
end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-        self.lower = lower
-        self.upper = upper
-        self.step = step
-
-
-class ExtSlice(slice):
-    _FIELDS = ["dims", "lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, dims, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-        self.dims = dims
-
-
-class Index(slice):
-    _FIELDS = ["value", "lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, value, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-        self.value = value
-
-
 class Subscript(expr):
     _FIELDS = ["value", "slice", "ctx", "lineno", "col_offset", "end_lineno", 
"end_col_offset"]
 
@@ -620,308 +594,280 @@ class Tuple(expr):
         self.ctx = ctx
 
 
-class expr_context(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-
-
-class AugLoad(expr_context):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-
-
-class AugStore(expr_context):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+class Slice(AST):
+    _FIELDS = ["lower", "upper", "step"]
 
-
-class Param(expr_context):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
-
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, lower, upper, step):
+        super().__init__()
+        self.lower = lower
+        self.upper = upper
+        self.step = step
 
 
-class Suite(mod):
-    _FIELDS = ["body", "lineno", "col_offset", "end_lineno", "end_col_offset"]
+class expr_context(AST):
+    _FIELDS = []
 
-    def __init__(self, body, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
-        self.body = body
+    def __init__(self):
+        super().__init__()
 
 
 class Del(expr_context):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Load(expr_context):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Store(expr_context):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class boolop(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class And(boolop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Or(boolop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class operator(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Add(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class BitAnd(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class BitOr(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class BitXor(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Div(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class FloorDiv(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class LShift(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Mod(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Mult(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class MatMult(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Pow(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class RShift(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Sub(operator):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class unaryop(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Invert(unaryop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Not(unaryop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class UAdd(unaryop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class USub(unaryop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class cmpop(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Eq(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Gt(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class GtE(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class In(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Is(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class IsNot(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class Lt(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class LtE(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class NotEq(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class NotIn(cmpop):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class comprehension(AST):
-    _FIELDS = [
-        "target",
-        "iter",
-        "ifs",
-        "is_async",
-        "lineno",
-        "col_offset",
-        "end_lineno",
-        "end_col_offset",
-    ]
+    _FIELDS = ["target", "iter", "ifs", "is_async"]
 
-    def __init__(self, target, iter, ifs, is_async, lineno, col_offset, 
end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, target, iter, ifs, is_async):
+        super().__init__()
         self.target = target
         self.iter = iter
         self.ifs = ifs
@@ -929,36 +875,24 @@ class comprehension(AST):
 
 
 class excepthandler(AST):
-    _FIELDS = ["lineno", "col_offset", "end_lineno", "end_col_offset"]
+    _FIELDS = []
 
-    def __init__(self, lineno, col_offset, end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self):
+        super().__init__()
 
 
 class ExceptHandler(excepthandler):
-    _FIELDS = ["type", "name", "body", "lineno", "col_offset", "end_lineno", 
"end_col_offset"]
+    _FIELDS = ["type", "name", "body"]
 
-    def __init__(self, type, name, body, lineno, col_offset, end_lineno, 
end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, type, name, body):
+        super().__init__()
         self.type = type
         self.name = name
         self.body = body
 
 
 class arguments(AST):
-    _FIELDS = [
-        "args",
-        "vararg",
-        "kwonlyargs",
-        "kw_defaults",
-        "kwarg",
-        "defaults",
-        "posonlyargs",
-        "lineno",
-        "col_offset",
-        "end_lineno",
-        "end_col_offset",
-    ]
+    _FIELDS = ["args", "vararg", "kwonlyargs", "kw_defaults", "kwarg", 
"defaults", "posonlyargs"]
 
     def __init__(
         self,
@@ -969,12 +903,8 @@ class arguments(AST):
         kwarg,
         defaults,
         posonlyargs,
-        lineno,
-        col_offset,
-        end_lineno,
-        end_col_offset,
     ):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+        super().__init__()
         self.args = args
         self.vararg = vararg
         self.kwonlyargs = kwonlyargs
@@ -985,44 +915,37 @@ class arguments(AST):
 
 
 class arg(AST):
-    _FIELDS = ["arg", "annotation", "lineno", "col_offset", "end_lineno", 
"end_col_offset"]
+    _FIELDS = ["arg", "annotation"]
 
-    def __init__(self, arg, annotation, lineno, col_offset, end_lineno, 
end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, arg, annotation):
+        super().__init__()
         self.arg = arg
         self.annotation = annotation
 
 
 class keyword(AST):
-    _FIELDS = ["arg", "value", "lineno", "col_offset", "end_lineno", 
"end_col_offset"]
+    _FIELDS = ["arg", "value"]
 
-    def __init__(self, arg, value, lineno, col_offset, end_lineno, 
end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, arg, value):
+        super().__init__()
         self.arg = arg
         self.value = value
 
 
 class alias(AST):
-    _FIELDS = ["name", "asname", "lineno", "col_offset", "end_lineno", 
"end_col_offset"]
+    _FIELDS = ["name", "asname"]
 
-    def __init__(self, name, asname, lineno, col_offset, end_lineno, 
end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, name, asname):
+        super().__init__()
         self.name = name
         self.asname = asname
 
 
 class withitem(AST):
-    _FIELDS = [
-        "context_expr",
-        "optional_vars",
-        "lineno",
-        "col_offset",
-        "end_lineno",
-        "end_col_offset",
-    ]
+    _FIELDS = ["context_expr", "optional_vars"]
 
-    def __init__(self, context_expr, optional_vars, lineno, col_offset, 
end_lineno, end_col_offset):
-        super().__init__(lineno, col_offset, end_lineno, end_col_offset)
+    def __init__(self, context_expr, optional_vars):
+        super().__init__()
         self.context_expr = context_expr
         self.optional_vars = optional_vars
 
@@ -1077,20 +1000,13 @@ __all__ = [
     "Constant",
     "NamedExpr",
     "Attribute",
-    "slice",
     "Slice",
-    "ExtSlice",
-    "Index",
     "Subscript",
     "Starred",
     "Name",
     "List",
     "Tuple",
     "expr_context",
-    "AugLoad",
-    "AugStore",
-    "Param",
-    "Suite",
     "Del",
     "Load",
     "Store",
diff --git a/python/tvm/script/parser/core/evaluator.py 
b/python/tvm/script/parser/core/evaluator.py
index f979bb84b1..9d09df3d8e 100644
--- a/python/tvm/script/parser/core/evaluator.py
+++ b/python/tvm/script/parser/core/evaluator.py
@@ -148,12 +148,7 @@ class ExprEvaluator:
         col_offset = 0
         return doc.Name(
             id=name,
-            ctx=doc.Load(
-                lineno=lineno,
-                col_offset=col_offset,
-                end_lineno=None,
-                end_col_offset=None,
-            ),
+            ctx=doc.Load(),
             lineno=lineno,
             col_offset=col_offset,
             end_lineno=None,
@@ -230,7 +225,7 @@ class ExprEvaluator:
             ),
         ):
             return node
-        if not isinstance(node, (doc.expr, doc.slice)):
+        if not isinstance(node, (doc.expr, doc.Slice)):
             return node
         if isinstance(node, doc.Lambda):
             return self._eval_lambda(node)
diff --git a/python/tvm/script/parser/tir/parser.py 
b/python/tvm/script/parser/tir/parser.py
index ed59606158..f6141404fa 100644
--- a/python/tvm/script/parser/tir/parser.py
+++ b/python/tvm/script/parser/tir/parser.py
@@ -283,7 +283,7 @@ def visit_aug_assign(self: Parser, node: doc.AugAssign) -> 
None:
         node.value.end_lineno,
         node.value.end_col_offset,
     )
-    node.target.ctx = doc.Load(*lhs_pos)
+    node.target.ctx = doc.Load()
     with self.var_table.with_frame():
         lhs_name = "__tvm_tmp_value_aug_assign_lhs"
         rhs_name = "__tvm_tmp_value_aug_assign_rhs"
@@ -292,14 +292,14 @@ def visit_aug_assign(self: Parser, node: doc.AugAssign) 
-> None:
         self.var_table.add(lhs_name, lhs_expr)
         self.var_table.add(rhs_name, rhs_expr)
         op = doc.BinOp(
-            doc.Name(lhs_name, doc.Load(*lhs_pos), *lhs_pos),
+            doc.Name(lhs_name, doc.Load(), *lhs_pos),
             node.op,
-            doc.Name(rhs_name, doc.Load(*rhs_pos), *rhs_pos),
+            doc.Name(rhs_name, doc.Load(), *rhs_pos),
             *lhs_pos,
         )
         rhs = self.eval_expr(op)
     lhs = node.target
-    lhs.ctx = doc.Store(*lhs_pos)
+    lhs.ctx = doc.Store()
     if isinstance(lhs, doc.Subscript):
         if isinstance(lhs.slice, doc.Tuple):
             indices = []
diff --git a/tests/lint/filter_untracked.py b/tests/lint/filter_untracked.py
index 3227bc3f18..61c482cbbb 100644
--- a/tests/lint/filter_untracked.py
+++ b/tests/lint/filter_untracked.py
@@ -29,10 +29,7 @@ def check_output(args, **kw):
         sys.stderr.write("exited with code %d: %s\n" % (proc.returncode, " 
".join(args)))
         sys.exit(2)
 
-    if sys.version_info[0] == 2:
-        return unicode(out, "utf-8")
-    else:
-        return str(out, "utf-8")
+    return str(out, "utf-8")
 
 
 def main():
diff --git a/tests/python/relax/test_tvmscript_parser.py 
b/tests/python/relax/test_tvmscript_parser.py
index adfa692aeb..b3380f2d72 100644
--- a/tests/python/relax/test_tvmscript_parser.py
+++ b/tests/python/relax/test_tvmscript_parser.py
@@ -535,7 +535,6 @@ def test_tuple_return_2():
     _check(foo, bb.get()["foo"])
 
 
[email protected](sys.version_info < (3, 8), reason="requires python3.8 or 
higher")
 def test_tuple_binding():
     @R.function
     def foo(x: R.Tensor("float32", ndim=2)):
@@ -557,7 +556,6 @@ def test_tuple_binding():
     _check(foo, bb.get()["foo"])
 
 
[email protected](sys.version_info < (3, 8), reason="requires python3.8 or 
higher")
 def test_tuple_get_item():
     @R.function
     def foo(x: R.Tensor, y: R.Tensor):
@@ -1670,7 +1668,6 @@ def test_undefined_symbolic_var_raises_error():
             return z
 
 
[email protected](sys.version_info < (3, 8), reason="requires python3.8 or 
higher")
 def test_arith_operators():
     @R.function
     def foo(x: R.Tensor(("m", "n"), "float32"), y: R.Tensor(("m", "n"), 
"float32")):
diff --git a/tests/scripts/ci.py b/tests/scripts/ci.py
index 10d6312912..96f0a5f7ed 100755
--- a/tests/scripts/ci.py
+++ b/tests/scripts/ci.py
@@ -479,17 +479,11 @@ def cli_name(s: str) -> str:
 
 
 def typing_get_origin(annotation):
-    if sys.version_info >= (3, 8):
-        return typing.get_origin(annotation)
-    else:
-        return annotation.__origin__
+    return typing.get_origin(annotation)
 
 
 def typing_get_args(annotation):
-    if sys.version_info >= (3, 8):
-        return typing.get_args(annotation)
-    else:
-        return annotation.__args__
+    return typing.get_args(annotation)
 
 
 def is_optional_type(annotation):


Reply via email to