我的代码看起来有点类似于:
import os, sys
ABC = ''
XYZ = ''
FOO = ''
BAR = ''
ITEM = ''
CLEAN = ''
values = ['ABC', 'XYZ', 'FOO', 'BAR', 'ITEM', 'CLEAN']
# some code here
c = raw_input('> ')
if ' ' in c:
c = c.lower()
c = c.split()
if c[0] == 'set':
if c[1] in values:
exec("%s = '%s'" % (c[1], c[2]))
else:
# error...
# the code continues
正如您可能知道的那样,我正在尝试为变量赋值,但是根据用户输入决定该变量,而不是通过其名称引用变量。
基本上,我想要的是在开始时将c[2]
字符串分配给任一变量,具体取决于用户在c[1]
中选择哪一个,并在此过程中引用这些变量通过相同的别名(或类似的东西)。
# Desired input
> set FOO yes
> print FOO
# Desired output
yes
# Desired input 2
> set ITEM dark
> print ITEM
# Desired output 2
> dark
我无法想出任何事情。
=============================================== ============================
编辑:我编辑了代码,看看这是否会有所帮助,但事实并非如此。无论我用set键入什么内容,它都会停留在 else 条件下。
编辑2:这就解决了我的问题:
1)将values
列表转换为所有字符串
2)将.upper()
添加到c[1]
感谢Leopold发现错误。
答案 0 :(得分:0)
你有三个不同的错误。
values
是变量值的列表,而不是其名称的列表。所以他们都等于''
。您需要一个变量名称列表,如下所示:
values = ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"]
变量的名称是大写的,但您将命令字符串转换为小写。如果您输入set ITEM dark
,则会转换为['set', 'item', 'dark']
,而从'item' != 'ITEM'
开始,它将无法找到要设置的行进值。你应该跳过这一行
c = c.lower()
而只是使命令名称不区分大小写
if c[0].lower() == 'set':
val + " = %s" % c[2]
会产生ITEM = dark
,因此会尝试将变量ITEM
的值设置为变量dark
的值,但此变量不会存在。您想将其设置为字符串"dark"
,因此您需要引号:val + " = '%s'" % c[2]
最后:这是一个奇怪的事情,为什么要这样做?对于我能想到的大多数用例,你可以通过字典获得更好的服务,例如:
userSetVariables = dict( (k,'') for k in ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"] )
c = raw_input('> ')
if ' ' in c:
c = c.split()
if c[0].lower() == 'set' and userSetVariables.has_key(c[1]):
userSetVariables[c[1]] = c[2]
这导致:
> set ITEM dark
>>> print userSetVariables["ITEM"]
dark