将字符串转换为变量(一元+的错误操作数类型:'str')

时间:2016-04-09 22:39:53

标签: python

为什么我一直收到此错误?我猜raw_input()被读作输入(),它不能将用户输入视为字符串。我不知道如何改变它以便它可以工作。而且,不,问题是:“Python 2.7获取用户输入并以字符串形式操作而不引用”并不能回答我的问题。

options = ["An animal", "A food", "A fruit", "A number", "A superhero name", "A country", "A dessert", "A year"]
#"options" become variables
for i in options:
    if i[0:3] == "An ":
        exec("%s = %s" % (i[3::], raw_input("Enter " + i + " ")))
    else:
        exec("%s = %s" % (i[2::], raw_input("Enter " + i + " ")))

我一直收到这个错误:

NameError: name 'input' is not defined

1 个答案:

答案 0 :(得分:2)

你没有提供足够的信息,但我的心灵力量告诉我,当你提示"输入动物"时,你输入了input

尝试精神上了解您的代码正在做什么,特别是当您到达时:

exec("%s = %s" % (i[3::], raw_input("Enter " + i + " ")))

因此,对于循环的第一次迭代,这变为:

exec("%s = %s" % ("animal", "input"))

然后当替换发生时:

exec("animal = input")

这相当于输入:

animal = input

直接进入Python解释器。 input未定义,因此您获得:

NameError: name 'input' is not defined

你可能想要在右侧包含引号,以便在执行时将其视为字符串:

 exec("%s = '%s'" % ("animal", "input")) # Note that this is unsafe.  See the note below.

所有这一切,我觉得有义务说这段代码非常脆弱。当循环迭代到"超级英雄名称"时,它也会中断,因为superhero name不是有效的标识符。您可能应该将字符串拆分为空格,也许应该使用第二个单词,或者只是将所有空格替换为下划线。此外,您需要清理用户输入,以便用户无法通过在输入中提供引号来逃避。 (或者更好的方法是避免完全使用exec用户输入。你真的需要变量名吗?为什么不使用Python字典将提示的字符串映射到输入字符串?)