使用默认值预初始化 raw_input

Pre-initialize raw_input with default value

我有一个 "form",我有一些 raw_input 来获得用户响应。

现在我希望使用默认值对它们进行预初始化。有什么方法可以填写这些 raw_input 字段吗?还是有可能替代 raw_input 的好方法?

澄清一下,我有这样的东西:

val = raw_input("Input val:")

我想要的输出如下:

Input val: default value

并且我希望用户能够删除或编辑默认值,就像他们自己编写的一样。有什么办法吗?

您可以这样设置 raw_input(),如果用户没有输入任何内容 (只需按回车键),该值将设置为 "my_default":

i = raw_input("Input Something[my_default]:") or "my_default"

编辑::关于您的问题更新,正如评论中指出的那样,您不能使用 raw_input().

进行那种用户交互

raw_input 不像网络表单。这个名字应该已经暴露了:所有函数所做的就是接受原始输入(以字符串的形式),可以选择先打印提示。如果你想要一个默认值,你需要自己设置它,就像 中那样。


也就是说,您 可以 修改输入提示 看起来 有点像您想要的。 我完全不推荐这样做,但为了完整起见,请在交互式控制台中尝试以下代码:

default_val = 'default'
i = raw_input('Input val: {}\rInput val: '.format(default_val)) or default_val

这里我滥用 \r 字符将光标移回提示的开头。然后我重写了实际的提示部分,将光标留在 d 字符上,以便用户可以键入 "over" 它。

您会注意到 "default" 仍然显示在那里,直到您输入所有内容(此时它可能永远消失,具体取决于您的控制台的行为)。但是只显示;实际上不是输入的一部分。如果用户输入 "foo"(这将使提示看起来像这样:Input val: fooult),i 将获得 "foo" 的值。如果用户只是按 Enter 而没有输入文本, i 将是空字符串,这就是代码中仍然需要 or default_val 的原因。所有这些都是在说 这几乎肯定不是您想要的。 如果您想要 Web 表单,请制作 Web 表单。 raw_input(就此而言,控制台 I/O)不是为此而设计的。

经过谷歌搜索,我实际上自己找到了答案。在使用 readline 模块时可以用 raw_input 完成,如下所示:

import readline

def pre_input_hook():
    readline.insert_text('DefaultValue')
    readline.redisplay()

readline.set_pre_input_hook(pre_input_hook)

while True:
    line = raw_input('Prompt ("stop" to quit): ')
    if line == 'stop':
        break
    print 'ENTERED: "%s"' % line

或者,将其全部包装在基于 的更易于处理的函数中:

import readline

DEFAULT_TEXT = ''

def default_hook():
    """Insert some default text into the raw_input."""
    readline.insert_text(default_hook.default_text)
    readline.redisplay()

readline.set_pre_input_hook(default_hook)

def raw_input_default(prompt, default=None):
    """Take raw_input with a default value."""
    default_hook.default_text = DEFAULT_TEXT if default is None else default
    return raw_input(prompt)