【问题标题】:Pre-initialize raw_input with default value使用默认值预初始化 raw_input
【发布时间】:2015-02-18 16:34:52
【问题描述】:

我有一个“表单”,其中有几个raw_inputs 来获取用户响应。

现在我希望它们使用默认值进行预初始化。有没有办法填写这些raw_input 字段?或者在可能的情况下,raw_input 有什么好的替代方案吗?

为了澄清,我有一些看起来像这样的东西:

val = raw_input("Input val:")

我想要的输出如下:

Input val: default value

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

【问题讨论】:

  • 带有 raw_input 的表单是什么意思?它们通常是两种不同的东西。通常,您可以使用例如user_input = raw_input() or default_value,但您的要求并不完全清楚。
  • 我编辑了问题以表明我的意思
  • 你不能用raw_input做那种事情,不。您可以告诉用户默认值是什么(根据 Elizion 的回答,虽然我会考虑默认值以减少重复),但他们无法与提示文本交互。
  • 找到了办法,看我的回答。

标签: python linux python-2.7 input


【解决方案1】:

raw_input 不像网络表单。该名称应该放弃它:该函数所做的只是接受原始输入(以字符串的形式),可选地首先打印一个提示。如果您想要一个默认值,您需要自己设置它,如Elizion's answer


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

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。所有这一切都说明这几乎肯定不是您想要做的。如果您想要一个网络表单,请制作一个网络表单。 raw_input(就此而言,控制台 I/O)不是为此而设计的。

【讨论】:

  • 实际上,我找到了一种干净利落的方法。看看我的回答。不过感谢您的回答,我喜欢这个 hack ;)
【解决方案2】:

实际上,在谷歌搜索之后,我自己找到了答案。使用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

或者,将其全部封装在基于jonrsharpe's comment 的更易于处理的函数中:

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)

【讨论】:

  • 请注意,这是不可移植的 - 它不能在 Windows 机器上运行。
  • 另外,在UPPERCASE_WITH_UNDERSCORES 中创建名称是不好的形式,表明它是常量,然后再更改它。
  • 另一种选择是使用函数属性 - 参见例如gist.github.com/textbook/a046aef433bb9b9d43c4
  • 看起来很酷。接触 Python 的时间不长,所以对 Python 的大部分不太常见的概念一无所知。您介意我将您的代码放入答案中吗?
  • 一点也不,去吧!
【解决方案3】:

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

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

编辑::关于您的问题更新,正如 cmets 中指出的那样,您不能使用 raw_input() 进行那种用户交互。

【讨论】:

  • 嗯,这行得通,但这不是我想要的。如果没有更好的方法,我会使用它。
  • @Dakkaron 查看问题更新(只是为了澄清)
  • 我找到了一种使用 raw_input() 进行这种用户交互的方法。看看我的回答。
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 2014-12-29
  • 2017-12-18
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
相关资源
最近更新 更多