Python - 根据用户输入分配不同名称下的变量

时间:2016-01-23 06:56:35

标签: python string variables reference alias

我的代码看起来有点类似于:

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发现错误。

1 个答案:

答案 0 :(得分:0)

你有三个不同的错误。

  1. values是变量值的列表,而不是其名称的列表。所以他们都等于''。您需要一个变量名称列表,如下所示:

    values = ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"]
    
  2. 变量的名称是大写的,但您将命令字符串转换为小写。如果您输入set ITEM dark,则会转换为['set', 'item', 'dark'],而从'item' != 'ITEM'开始,它将无法找到要设置的行进值。你应该跳过这一行

    c = c.lower()
    

    而只是使命令名称不区分大小写

    if c[0].lower() == 'set':
    
  3. val + " = %s" % c[2]会产生ITEM = dark,因此会尝试将变量ITEM的值设置为变量dark的值,但此变量不会存在。您想将其设置为字符串"dark",因此您需要引号:val + " = '%s'" % c[2]

  4. 最后:这是一个奇怪的事情,为什么要这样做?对于我能想到的大多数用例,你可以通过字典获得更好的服务,例如:

    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