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

Python的lxml.etree.tostring()在Mac和Linux上的缩进方式不同 – 缩进似乎是Linux上缩进的两倍。 这是炸毁我的unit testing。

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

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

编辑添加代码:

我确定代码是一样的,计算机通过github共享。

这里是testing代码:

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' ? ++++++ ++++++ ++++++ ++++++ ++++ ++++++++++++ 

这个输出实际上是在一条线上。 我已经插入了第一个换行符号和? 字符。

我search了testing输出的标签('\ t')。 我相信我不插入制表符,我使用vi w /'set expandtab'。

你是否在每种情况下使用完全相同的参数tostring() ? 你试过关闭缩进来检查是否真的是这个问题?

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

更新 :你的“chk”字符串的缩进看起来很可疑。 我建议lxml没有错,而且你有一个有空白区别的实验性错误。 你从你的代码中删除了所有的TAB吗? 你确定你没有打开/保存你的代码与编辑器,用空格替换标签,反之亦然? 你为什么不使用repr()建议显示正确/明确不平等的字符串是什么?

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

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