2017-02-14 67 views
0

我想要从字符串中分配变量名称的问题。我知道这被称为动态分配变量名称,但其他页面上的解决方案我不认为适用于这种情况,或者我根本不明白。通过在Python中迭代字符串来指定类变量

我试图把一个字符串变成一个国际象棋棋盘,其中董事会是列表的列表。每个列表一行,每个项目各自的列。

def splitString(string, length): 
    """Split string into lengths on n.""" 
    return [string[i:i + length] for i in range(0, len(string), length)] 


def colourFromCase(letter): 
    """Work out if a letter is uppercase, therefore white.""" 
    if letter.isupper(): 
     return 'white' 
    else: 
     return 'black' 


def buildBoard(height, width): 
    """Build a board.""" 
    global rows 
    rows = [] 
    board = 'CNBHKDRNCPPPPPPPPPpppppppppcnrdkhbnc' 
    split = splitString(board, width) 
    for n in split[0]: 
     className = eval(str(ABBRIVIATIONS[(n.upper())]) + 
         '(' + colourFromCase(n) + ') 

重点在于buildBoard函数 - 最后一个for循环。我需要使用一个类变量n的名称来创建一个变量。

我的第一个猜测是:

eval(n) = eval(str(ABBRIVIATIONS[(n.upper())]) + 
       '(' + colourFromCase(n) + ') 

我明白我没有使这个令人难以置信的清晰。我不认为eval或exec是要走的路,但是我不明白我可以如何使用字典或getattr()来做到这一点,因为在我将这个变量添加到board.append( )

+1

不要这样做。几乎是不必要的。使用字典来存储字符串/值对。 “eval”的使用应该会引起红旗。 – Carcigenicate

+0

您有什么机会可以将我链接到某个地方并且带有这方面的示例,我不知道谷歌是怎么回事...... – Skidushe

+0

您知道Python中的字典('{}')是什么吗? – Carcigenicate

回答

0

您可以随时使用字典图保持引用类类型,例如:

FIGURES = {"B": BType, "C": CType, "D": DType, "H": HType, "K": KType, "N": NType, "R": RType} 

def buildBoard(height, width): 
    """Build a board.""" 
    global rows 
    rows = [] 
    board = 'CNBHKDRNCPPPPPPPPPpppppppppcnrdkhbnc' 
    split = splitString(board, width) 
    for n in split[0]: 
     figure = FIGURES[n.upper()](colourFromCase(n)) 
     # etc. 

当然,请确保您有在FIGURES字典中引用的所有可能的数据,并确保它们指向你现在在ABBRIVIATIONS存储什么。另外,请确保您的类接受白色/黑色字符串作为其init参数。