通过迭代 Python 中的字符串分配 class 变量

Assigning class variables through iteration of a string in 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 的变量,它是一个 class 变量。

我的第一个猜测是:

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

我知道我没有说清楚。我不认为 eval 或 exec 是可行的方法,但我不知道如何使用字典或 getattr() 来执行此操作,因为在我要使用 [=24= 将变量添加到面板之后]()

您始终可以使用包含对 class 类型的引用的字典映射,例如:

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 classes 接受 white/black 字符串作为它们的初始参数。