我有想要从字符串中分配变量名的问题。我知道这被称为动态分配变量名称,但我认为不适用于其他页面的解决方案适用于这种情况,或者我根本不理解。
我正在尝试将一个字符串变成一个棋盘,其中该板是一个列表列表。每个列表一行,每个项目各自列。
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的板上( )
答案 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参数。