Skip to content

Conversation

sookach
Copy link

@sookach sookach commented Sep 13, 2025

Python 3.14 removes the ast.Str node type. String literals now appear as ast.Constant(value=str).
Update the AST check to accept both ast.Str (for older Pythons) and ast.Constant with a string value (for Python 3.8+), allowing html5lib to build successfully on Python 3.14 while remaining compatible with older version. Tested at desk with pip install -e .

Fixes: #588

@atsampson
Copy link

This isn't right for pre-3.14 versions - the version = line fails because there's no a.value.value on older versions. Something like this works (tested on 2.7 and 3.11-3.14):

version = None
with open(join(here, "html5lib", "__init__.py"), "rb") as init_file:
    t = ast.parse(init_file.read(), filename="__init__.py", mode="exec")
    assert isinstance(t, ast.Module)
    assignments = filter(lambda x: isinstance(x, ast.Assign), t.body)
    for a in assignments:
        if (len(a.targets) == 1 and
                isinstance(a.targets[0], ast.Name) and
                a.targets[0].id == "__version__"):
            if hasattr(ast, "Str") and isinstance(a.value, ast.Str):
                version = a.value.s
            elif (hasattr(ast, "Constant")
                  and isinstance(a.value, ast.Constant)
                  and isinstance(a.value.value, str)):
                version = a.value.value
assert version is not None

Python 3.14 removes the ast.Str node type. String literals now appear
as ast.Constant(value=str).
Update the AST check to accept both ast.Str (for older Pythons) and
ast.Constant with a string value (for Python 3.8+), allowing html5lib to
build successfully on Python 3.14 while remaining compatible with older
version.
@sookach
Copy link
Author

sookach commented Oct 10, 2025

Thanks! Updated the PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

html5lib fails to build on Python 3.14 (uses removed ast.Str node)

2 participants