【问题标题】:Assigning class variables through iteration of a string in Python通过 Python 中的字符串迭代来分配类变量
【发布时间】:2017-02-14 17:25:55
【问题描述】:

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

我正在尝试将字符串变成棋盘,棋盘是列表的列表。每个列表一行,每个项目对应的列。

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( )

【问题讨论】:

  • 不要这样做。几乎从不需要。改用字典来存储字符串/值对。使用eval 应该会引起危险。
  • 你能不能把我链接到一些有这个例子的地方,我不知道用谷歌搜索什么......
  • 你知道 Python 中的字典 ({}) 是什么吗?
  • 我有,但我不知道如何将它用于此用途...
  • 您正在尝试动态创建变量。假设您要创建一个名为something2 的变量,其中包含3。为什么不将字符串 "something2" 作为键添加到以 3 为值的字典中?

标签: python iteration dynamic-variables


【解决方案1】:

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

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 参数。

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2017-10-18
    • 2013-11-02
    • 2011-12-28
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多