【问题标题】:Faulty string representation错误的字符串表示
【发布时间】:2016-02-16 23:16:26
【问题描述】:

我对 Python 非常非常陌生,我想我可以做一个简单的应用程序来为我解析 xml 格式。问题是,看起来我从element.getElementsByTagName() 方法中获取了无效元素。我将在下面附上所有相关的源代码。

尝试格式化从 XML 捕获的数据时会出现问题;错误代码如下:

Traceback (most recent call last):
        File "C:/development/xml2dnf/main.py", line 8, in <module> output_file.write(str(result))
        File "C:\development\xml2dnf\Shotsheet.py", line 18, in __str__ reply += str(shot) + "\n"
        File "C:\development\xml2dnf\StaticShot.py", line 19, in __str__ self.rect[2], self.rect[3])
ValueError: unexpected '{' in field name

我试图摆弄报告的有问题的行,直到我发现错误可能不存在。随着我的层次结构的提升,我注意到如果我告诉我的一个类解析我发送给它的特定列表,它几乎可以按预期工作。当我不解析上述内容时,错误就会神奇地消失。

认为我的一对类是问题,我去找他们并尽我所能找到一个缓解那个流浪的'{'。我没有发现任何问题。

我试图排除故障,直到 xml 本身。我打印了它,看起来还不错。然而,当我打印我应该得到的结果时,我注意到它打印了一些奇怪的无效值,然后打印了如果不存在错误的话我应该得到的结果。

我在 Google 上进行了一些搜索,但在这个问题上几乎找不到。无论我能找到什么都不能缓解我的问题或无关紧要。考虑到我是该语言的新手,我已经用尽了我的故障排除。


更新:

在弄乱了 XML 之后,我注意到无效元素是由于我不了解 getElementsById 的工作原理造成的。该方法返回具有 ID 的 所有 元素,而不是仅返回元素的直接子元素。调整实现解决了这个问题。

现在我已经解决了这个问题,但我仍然遇到上述错误。我唯一能想到的是我的__str__ 我的类实现是错误的,但我仍然看不到如何。单独打印每个参数会产生预期的结果,但使用 __str__ 会失败,并且该错误无法以任何可以想象的方式帮助我。

为了便于说明,下面是解释器所说的错误代码:

def __str__(self):
        reply = "ShotData\x7Bid = {0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1],
                                                                           self.rect[2], self.rect[3])
        if self.render != 'ALPHA':
            reply += "render = {0} ".format(self.render)

        if self.collision >= 0:
            reply += "collision = {0} ".format(self.collision)

        if self.fixed_angle:
            reply += "fixed_angle = true angular_velocity = {0}\x7D".format(self.angular_velocity)

        delay_string = str(self.delay_color)
        reply += "delay_color = {0} ".format(delay_string)

        return reply

调用它的代码:

def __str__(self):
        reply = "#UserShotData\n\nshot_image = {0}\ndelay_rect=({1}, {2}, {3}, {4})\n\n"

        for shot in self.shot_array:
            reply += str(shot) + "\n"

        delay_x1 = self.delay_rect[0]
        delay_y1 = self.delay_rect[1]
        delay_x2 = self.delay_rect[2]
        delay_y2 = self.delay_rect[3]

        return reply.format(self.shot_image, delay_x1, delay_y1, delay_x2, delay_y2)

以及要求字符串表示的指令:

output_file.write(str(result))

与往常一样,我们将非常感谢您对此问题的任何帮助。

【问题讨论】:

  • 这里的代码太多了。你能把它简化为一个能说明问题的最小例子吗?
  • @larsks 我已经及时更新了这个问题,因为错误的性质已经发生了变化。我还将显示的代码量降至最低。

标签: python python-3.x


【解决方案1】:

问题是写ShotData\x7Bid 与写ShotData{Bid 完全相同,这里使用转义序列不会导致.format 对待花括号有任何不同。如果要转义花括号,则需要将其加倍:

reply = "ShotData{{id = {0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1], self.rect[2], self.rect[3])

【讨论】:

    【解决方案2】:

    答案在于格式行。 \x7B 字符打破了它。如果你想在格式化的字符串中插入大括号,我建议你之后再做:

     reply = "{0} rect = ({1}, {2}, {3}, {4})   ".format(self.index, self.rect[0], self.rect[1], self.rect[2],self.rect[3])
     reply = "ShotData{Bid = " + reply
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2013-01-14
      • 1970-01-01
      • 2013-01-15
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多