Skip to content

Conversation

@gene1wood
Copy link
Contributor

This changes the implementation of the fixes in #1836 and #2093 to address the problem that they created when click.prompt or click.confirm has a prompt_suffix value which is empty.

This still fixes the problems reported in #665 and #2092 but does so without modifying the prompt and adding a trailing space.

Previously, the problem was solved by trimming all trailing space characters from the prompt and then adding a single trailing space to every prompt. This was only visible if the last character in the prompt wasn't a space character. In those cases a prompt like "This is my prompt" would render as "This is my prompt ". Additionally, in the previous solution, if the err=True argument was passed, that final trailing space character that was added would be sent to STDOUT while the rest of the prompt would go to STDERR. This also wasn't very apparent since it was a space character.

This different implementation uses the last character of the prompt to work around #665 and #2092 instead of adding a space character. This fixes most of the potentially confusing behavior. It does retain one confusing behavior which is described above, where if you use err=True the last character of the prompt is sent to STDOUT instead of STDERR. Previously, this last character sent to STDOUT would always be a space character. Now if the last character of the prompt is not a space character, that final character will go to STDOUT.

For example if you call

click.prompt("bar", prompt_suffix="", err=True)

The ba will go to STDERR and the r will go to STDOUT. Previously bar would go to STDERR and an added would go to STDOUT.

This odd behavior, which is already present but just applies to a space character, is worth accepting so that the prompt_suffix correctly renders the suffix as it did in version 7.1.2 and prior.

This also adds unit tests for cases where prompt_suffix is empty.

This fixes #3019

This changes the implementation of the fixes in pallets#1836 and pallets#2093 to address
the problem that they created when `click.prompt` or `click.confirm` has a
`prompt_suffix` value which is empty.

This still fixes the problems reported in pallets#665 and pallets#2092 but does so without
modifying the prompt and adding a trailing space.

Previously, the problem was solved by trimming all trailing space characters
from the prompt and then adding a single trailing space to every prompt.
This was only visible if the last character in the prompt wasn't a space
character. In those cases a prompt like "This is my prompt" would render
as "This is my prompt ". Additionally, in the previous solution, if the
`err=True` argument was passed, that final trailing space character that
was added would be sent to STDOUT while the rest of the prompt would go
to STDERR. This also wasn't very apparent since it was a space character.

This different implementation uses the last character of the prompt to
work around pallets#665 and pallets#2092 instead of adding a space character. This fixes
most of the potentially confusing behavior. It does retain one confusing
behavior which is described above, where if you use `err=True` the last
character of the prompt is sent to STDOUT instead of STDERR. Previously,
this last character sent to STDOUT would always be a space character.
Now if the last character of the prompt is not a space character, that final
character will go to STDOUT.

For example if you call

```python
click.prompt("bar", prompt_suffix="", err=True)
```

The `ba` will go to STDERR and the `r` will go to STDOUT.
Previously `bar` would go to STDERR and an added ` ` would go to STDOUT.

This odd behavior, which is already present but just applies to a space
character, is worth accepting so that the `prompt_suffix` correctly renders
the suffix as it did in version 7.1.2 and prior.

This also adds unit tests for cases where `prompt_suffix` is empty.

This fixes pallets#3019
@Rowlando13 Rowlando13 added this to the 8.3.1 milestone Sep 24, 2025
@Rowlando13 Rowlando13 added the bug label Sep 24, 2025
@kdeldycke kdeldycke added the f:prompt feature: prompt for input label Sep 25, 2025
@kdeldycke
Copy link
Collaborator

I agree with you that having the last character of the prompt being sent to <stdout> instead of <stderr> is confusing.

But your PR has the merit of:

  • making the behavior more deterministic
  • not hiding the edge-case visually by resorting to spaces
  • adding unit-tests on cases that were not covered before

For me this is a case of "worse is better", in which we gradually tends to the ideal behavior. The ideal behavior being a refactor of the prompt() / confirm() methods.

I am in favor of merging it in stable for a Click 8.3.1 release.

But before that, could you:

  • add a .. versionchanged:: 8.3.1 item in the docstring of each function to explain the change in behavior,
  • add a changelog entry to CHANGES.rst,
  • and change the branch target from main to stable please?

@gene1wood gene1wood changed the base branch from main to stable September 25, 2025 15:41
@gene1wood
Copy link
Contributor Author

@kdeldycke Sure thing

I've

  • Re-added the note to CHANGES.rst
  • Changed the PR to be based off of stable
  • Updated docstrings for confirm and prompt
    • Note : I tried to find a sweet spot between too verbose and too succinct with the docstring additions. If you'd like to see more or less detail let me know and I can tweak them.

@Rowlando13 Rowlando13 merged commit 8533c96 into pallets:stable Oct 2, 2025
10 checks passed
@gene1wood gene1wood deleted the fix_prompt_suffix branch October 2, 2025 05:58
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Oct 17, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bug f:prompt feature: prompt for input

Projects

None yet

Development

Successfully merging this pull request may close these issues.

click.prompt and click.confirm argument prompt_suffix no longer works when suffix is empty

4 participants