3

我正在复习我的 Python 并且我对某些事情有点困惑,以下代码无法按预期工作:

def a():
    print "called a"

def b():
    print "called b"

dispatch = {'go':a, 'stop':b}
dispatch[input()]()

当我在控制台中输入单词go时,我得到“NameError:name 'go' is not defined”,但是当我输入 'go'(带引号)时它工作正常。input() 不返回字符串吗?如果不是,那么不应该使用 str() 将输入转换为字符串吗?

当我将代码更改为:

dispatch[(str(input())]()

我仍然得到相同的行为。

注意:我使用的是 Python2.7,如果它有所作为的话。

对不起,如果这很明显,我已经有几年没有使用 Python 了!

4

4 回答 4

3

input()在 Python 2.7 中相当于:

eval(raw_input())

因此,您应该raw_input()在 python 2.7 中使用以避免此类错误,因为它不会尝试eval评估给定的输入。

因为您添加了引号,所以 Python 将其解释为字符串。

另外,请注意这raw_input()将返回一个字符串,因此str()围绕它进行调用是没有意义的。


请注意,在 Python 3 中,与Python 2.7 中的input()行为类似raw_input()

于 2013-09-12T08:47:25.953 回答
2

你想要raw_input()input()将用户的输入评估为 Python 代码。

于 2013-09-12T08:47:31.830 回答
1

使用raw_input(). input()等效于eval(raw_input()),因此当您键入不带引号的 go 时,python 会尝试 eval go 并失败。使用引号,它评估的是字符串(即返回它),它将用于索引您的字典。

raw_input 在任何情况下都可以使用。

于 2013-09-12T08:52:17.580 回答
1

你也可以使用这个:

def go():
    print "called a"


def stop():
    print "called b"

input()()  # Equivalent to eval(raw_input())()
# OR
my_function = input()
my_function()  # Might be easier to read

# Another way of doing it:

val = raw_input()
globals()[val]()
于 2013-09-12T08:55:43.083 回答