Skip to content

Python 3.14 REPL blanks links above terminal rows when pasting #135055

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
treyhunner opened this issue Jun 3, 2025 · 1 comment
Open

Python 3.14 REPL blanks links above terminal rows when pasting #135055

treyhunner opened this issue Jun 3, 2025 · 1 comment
Labels
3.14 bugs and security fixes 3.15 new features, bugs and security fixes topic-repl Related to the interactive shell type-bug An unexpected behavior, bug, or error

Comments

@treyhunner
Copy link
Member

treyhunner commented Jun 3, 2025

Bug report

Bug description:

In Python 3.14 beta 2, pasting code that has more lines than the height of my terminal window will result in the lines just above the terminal window being blank.

To reproduce:

  1. Resize your terminal so the height is approximately 20 rows
  2. Paste the below block of Python code.
  3. Scroll up in your terminal to see previous lines above the last 20 rows
  4. Note that all rows above the terminal screen are blank (no class Point: line or __slots__ line for example)
class Point:
    __slots__ = ('x', 'y')
    __match_args__ = ('x', 'y')

    def __init__(self, x: float, y: float) -> None:
        object.__setattr__(self, 'x', x)
        object.__setattr__(self, 'y', y)

    def __repr__(self):
        cls = type(self).__name__
        return f'{cls}(x={self.x!r}, y={self.y!r})'

    def __eq__(self, other):
        if not isinstance(other, Point):
            return NotImplemented
        return (self.x, self.y) == (other.x, other.y)

    def __hash__(self):
        return hash((self.x, self.y))

    def __setattr__(self, name, value):
        raise AttributeError(f"Can't set attribute {name!r}")

    def __delattr__(self, name):
        raise AttributeError(f"Can't delete attribute {name!r}")

    def __getstate__(self):
        return (self.x, self.y)

    def __setstate__(self, state):
        fields = ('x', 'y')
        for field, value in zip(fields, state):
            object.__setattr__(self, field, value)

This is essentially the same as the "Blank lines" section of issue #119517.

I assume this is being done for performance reasons, but this is going to make my life harder when teaching. I often use a large font when teaching, so it's not uncommon that I'll paste a block of code that is longer than the terminal height. Being able to scroll up and show my students what was pasted is an essential feature for me when teaching.

CPython versions tested on:

3.14

Operating systems tested on:

Linux

@treyhunner treyhunner added the type-bug An unexpected behavior, bug, or error label Jun 3, 2025
@emmatyping emmatyping added topic-repl Related to the interactive shell 3.14 bugs and security fixes 3.15 new features, bugs and security fixes labels Jun 3, 2025
@tomasr8
Copy link
Member

tomasr8 commented Jun 3, 2025

Bisected to fac41f5 (#133247)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.14 bugs and security fixes 3.15 new features, bugs and security fixes topic-repl Related to the interactive shell type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

3 participants