lxml.etree.tostring()中的缩进因Mac和Linux而异

时间:2012-01-03 20:17:22

标签: python linux macos lxml

Python的lxml.etree.tostring()在Mac和Linux上的缩进方式不同 - 缩进似乎是Linux上的缩进的两倍。它正在炸毁我的单元测试。

显然lxml.etree不会公开任何设置默认缩进值的路径。

任何人都知道这里会发生什么?

编辑添加代码:

我确定代码是相同的,计算机通过github共享它。

这是测试代码:

    chk = """\
<field>
      <id>7135260</id>
      <name>lastname</name>
      <label>Last Name</label>
      <type/>
    </field>"""

        res = etree.tostring((xml_obj.xpath(xp_str))[0], pretty_print=True)

        self.assertMultiLineEqual(
            chk,
            res.rstrip()
        )

这在Linux上传递,但在Mac上失败,并出现此错误报告:

-       <id>7135260</id>
+             <id>7135260</id>
? ++++++
-       <name>lastname</name>
+             <name>lastname</name>
? ++++++
-       <label>Last Name</label>
+             <label>Last Name</label>
? ++++++
-       <type/>
+             <type/>
? ++++++
-     </field>
+         </field>
? ++++

但是当我隔离有问题的代码时,它会在两者上输出相同的内容:

data_str    =   """\
<response>
  <fields>
    <field>
      <id>7135259</id>
      <name>firstname</name>
      <label>First Name</label>
      <type/>
    </field>
    <field>
      <id>7135260</id>
      <name>lastname</name>
      <label>Last Name</label>
      <type/>
    </field>
  </fields>
  <status>success</status>
</response>
"""

data_xml    =   etree.fromstring(data_str)

res = etree.tostring(
        (data_xml.xpath('//*[name="lastname"]/name/..'))[0], 
        pretty_print=True)

print res

在两个平台上都有相同的缩进。

因此无论奇怪的是什么,它都是由unittest2定位于/感应的。这可能不是一个非常好的问题。

进一步编辑:

当我在repr()中包装比较项时,我得到了这个:

- '<field>\n      <id>7135260</id>\n      <name>lastname</name>\n      <label>Last Name</label>\n      <type/>\n    </field>'
+ '<field>\n            <id>7135260</id>\n            <name>lastname</name>\n            <label>Last Name</label>\n            <type/>\n        </field>\n        \n'
?           ++++++                        ++++++                                   ++++++                                ++++++             ++++        ++++++++++++

该输出实际上只有一行。我先插入换行+符号和?字符。

我在测试输出中搜索了标签('\ t')。我确定我没有插入制表符,我正在使用vi w /'set expandtab'。

2 个答案:

答案 0 :(得分:2)

在每种情况下,您是否正在使用与<{1}}相同的 相同的args?您是否尝试过关闭缩进以检查是否确实存在问题?

向我们展示调用tostring()的代码。创建一个小示例树,并在每个OS上向我们显示print len(result_of_tostring),repr(result_of_tostring)的结果。还要告诉我们如何将结果传输到另一个系统进行比较,并向我们展示该比较的代码。

更新:“chk”字符串的缩进看起来很可疑。我建议lxml没有任何问题,你有一个实验错误,它有空白差异。您是否从代码中删除了所有TAB?您确定没有使用用空格替换制表符的编辑器打开/保存您的代码,反之亦然? 为什么不按照建议使用repr()来准确/明确地显示不等字符串是什么?

更新2 :在源代码中搜索标签。对于大多数行,您显示的“chk”源的缩进为6。

答案 1 :(得分:1)

您可以编写一个assertXMLEqual方法,在比较之前删除缩进。你的测试应该检查你测试的函数中的xml dom是否正确,序列化和缩进的方式与此无关。