python - Mac 和 Linux 中 lxml.etree.tostring() 中的缩进有所不同

标签 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'。

最佳答案

在每种情况下,您是否对 tostring() 使用完全相同相同的参数?您是否尝试过关闭缩进来检查这是否确实是问题所在?

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

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

更新 2:在源代码中搜索选项卡。您显示的“chk”源代码的大多数行的缩进为 6。

关于python - Mac 和 Linux 中 lxml.etree.tostring() 中的缩进有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8718072/

相关文章:

macos - libxml-ruby:无法构建 gem native 扩展

python - 将 json 对象插入数据湖

java - 如何使用 bash 在 linux 系统上构建/运行 java 项目?

MySQL/phpMyAdmin 重置 ROOT 密码?

ruby-on-rails - 从目录打开Vim时如何自动返回 'set path'?

ios - CocoaPods 的 Pods.xcconfig 与现有的冲突

python - django-admin.py startproject mysite 不工作 python 2.7

javascript - 如何将数据从 python 流式传输到 javascript

python - 将两个 bool 数组相交为 True

linux - 如何使用内核模块监控进程创建和统计