我们一直是粉丝的忠实粉丝pylint.它的静态分析已成为我们所有python项目的关键部分,并且节省了大量时间来追逐晦涩的错误.但是从1.3 - > 1.4升级后,几乎所有编译的c扩展都会导致E1101(无成员)错误.
之前通过pylint1.3 运行完全清洁的项目现在抱怨几乎每个使用E1101的C扩展成员.我们被迫禁用E1101错误,但这实际上减损了它的用处pylint.
例如,这完全有效地使用了lxml包
r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')
Run Code Online (Sandbox Code Playgroud)
运行此过程pylint,它会报告:
$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E: 3, 6: Module 'lxml.etree' has no 'Element' member (no-member)
Run Code Online (Sandbox Code Playgroud)
但它完全有效:
$ python valid.py
<Element mydoc at 7fddf67b1ba8>
Run Code Online (Sandbox Code Playgroud)
这里真的很奇怪.一小部分C扩展似乎可以正常工作pylint,例如:
r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version
$ pylint -rn valid2.py
No config file …Run Code Online (Sandbox Code Playgroud) 问题是这样的:我有一个像这样的XML片段:
<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>
Run Code Online (Sandbox Code Playgroud)
对于结果,我想删除所有<a>- 和 - <c>标签,但保留它们的(文本)内容和子节点就像它们一样.此外,<b>-Element应保持不变.结果应该是这样的
<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>
Run Code Online (Sandbox Code Playgroud)
暂时,我将恢复一个非常肮脏的技巧:我将etree.tostring片段,通过正则表达式删除有问题的标签,并用etree.fromstring结果替换原始片段(不是真正的代码,但应该是这样的):
from lxml import etree
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>")
fstring = etree.tostring(fragment)
fstring = fstring.replace("<a>","")
fstring = fstring.replace("</a>","")
fstring = fstring.replace("<c>","")
fstring = fstring.replace("</c>","")
fragment = etree.fromstring(fstring)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用xslt实现这一点,我知道lxml可以使用xslt,但是必须有更多的lxml本机方法吗?
供参考:我已经尝试过使用lxml的element.replace,但由于我想在之前有一个元素节点的地方插入文本,我不认为我能做到这一点.