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是否正确,序列化和缩进的方式是不相关的。