通过在Python中迭代字符串来分配类变量

时间:2017-02-14 17:25:56

标签: python iteration dynamic-variables

我有想要从字符串中分配变量名的问题。我知道这被称为动态分配变量名称,但我认为不适用于其他页面的解决方案适用于这种情况,或者我根本不理解。

我正在尝试将一个字符串变成一个棋盘,其中该板是一个列表列表。每个列表一行,每个项目各自列。

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 个答案:

答案 0 :(得分: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中存储的内容。另外,请确保 figure 类接受白/黑字符串作为其init参数。