Python – 根据用户输入分配不同名称的变量
Python – assign variable under different name also depending on user input
我的代码看起来有点类似于:
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 发现错误。
你有三个不同的错误。
values
是变量值的列表,而不是它们的名称。所以它们都等于 ''
。您需要一个变量名列表,如下所示:
values = ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"]
变量名都是大写的,但是你把命令字符串转成了小写。如果输入 set ITEM dark
,它会转换为 ['set', 'item', 'dark']
,并且由于 'item' != 'ITEM'
,它不会找到要设置的行进值。你应该跳过这一行
c = c.lower()
而只是将命令名称设为 case-insensitive
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
我的代码看起来有点类似于:
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 发现错误。
你有三个不同的错误。
values
是变量值的列表,而不是它们的名称。所以它们都等于''
。您需要一个变量名列表,如下所示:values = ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"]
变量名都是大写的,但是你把命令字符串转成了小写。如果输入
set ITEM dark
,它会转换为['set', 'item', 'dark']
,并且由于'item' != 'ITEM'
,它不会找到要设置的行进值。你应该跳过这一行c = c.lower()
而只是将命令名称设为 case-insensitive
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