【问题标题】:Does Python Click prompt have any prefill options?Python Click 提示是否有任何预填充选项?
【发布时间】:2021-10-08 21:59:37
【问题描述】:

我正在尝试允许用户使用 Click 编辑配置文件中的参数。我想要做的是在提示输入中向他们提供预先填写的先前参数,以便他们可以直接编辑它,而不是让他们再次全部输入。 例如,如果参数是“test.com”,我希望我的提示呈现如下内容:

Edit Domain Name: testdomain.com

testdomain.com 是可编辑的。然后,当他们添加 1 使其读取 testdomain1.com 时,提示会将 testdomain1.com 返回到代码。 还有一些 10 年前的其他帖子,其中包含 readline 和其他类似 vanilla-python 的选项,例如 herehere,但我无法从 Click 文档中找出任何内容。

有人有什么想法吗?谢谢!

【问题讨论】:

  • 我不认为这个问题真的是关于 Click,你基本上是在问“我如何在预填充响应时使用 input() 或类似的东西?” - 答案是在 Linux 上使用 readline,或者在 Windows 上使用像 pyreadline 这样的第三方库来达到同样的效果。这就像使用input(),但允许您将值传递给预填充 - 用户可以离开或编辑它,无论他们做什么,结果都会返回。
  • 您可以有默认值,enter 可以接受,但我认为不可能根据实际可编辑默认值进行预填充。你知道默认行为吗?

标签: python python-click


【解决方案1】:

提示对于编辑文本不是最友好的。
幸运的是,有办法解决这个问题。

git commit为例。
如果您未指定 --message-m 选项,git commit 会打开一个编辑器供用户输入提交消息。

您可能还需要考虑使用文本编辑器提示您的用户。
您可以使用python-click 实现此目的,如下所示:

import click

def promp_user_with_editor(old_param: str) -> str:
    comment = "# Edit Domain Name:\n"
    editor_content = f"{comment}{old_param}"
    result = click.edit(editor_content)
    # In real code, you would properly handle the user's input here.
    new_param = result.split(comment)[1].strip()
    return new_param

@click.command()
def main():
    new_param = promp_user_with_editor(old_param="testdomain.com")
    click.echo(f"{new_param=}")

if __name__ == "__main__":
    main()

现在运行此代码:

python3 the_name_of_the_above_file.py

会提示我:

# Edit Domain Name:
testdomain.com

如果我将其更改为:

# Edit Domain Name:
stackoverflow.com

输出是:

new_param='stackoverflow.com'

【讨论】:

  • 感谢您的回复,并对延迟表示抱歉 - 这在工作中被推迟了几周。这就是我最终的结果,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 2019-06-20
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多