diff --git a/emeraldtree/ElementInclude.py b/emeraldtree/ElementInclude.py index 9abb63b..0952631 100644 --- a/emeraldtree/ElementInclude.py +++ b/emeraldtree/ElementInclude.py @@ -109,7 +109,7 @@ def include(elem, loader=None): node = loader(href, parse) if node is None: raise FatalIncludeError( - "cannot load %r as %r" % (href, parse) + "cannot load {!r} as {!r}".format(href, parse) ) node = copy.copy(node) if e.tail: @@ -119,7 +119,7 @@ def include(elem, loader=None): text = loader(href, parse, e.get("encoding")) if text is None: raise FatalIncludeError( - "cannot load %r as %r" % (href, parse) + "cannot load {!r} as {!r}".format(href, parse) ) if i: node = elem[i-1] diff --git a/emeraldtree/ElementPath.py b/emeraldtree/ElementPath.py index b0f3dd9..55b9952 100644 --- a/emeraldtree/ElementPath.py +++ b/emeraldtree/ElementPath.py @@ -77,14 +77,12 @@ def select(context, result): def prepare_star(next, token): def select(context, result): for elem in result: - for e in elem: - yield e + yield from elem return select def prepare_dot(next, token): def select(context, result): - for elem in result: - yield elem + yield from result return select def prepare_iter(next, token): diff --git a/emeraldtree/tests/test_tree.py b/emeraldtree/tests/test_tree.py index 37a0014..5aff12e 100644 --- a/emeraldtree/tests/test_tree.py +++ b/emeraldtree/tests/test_tree.py @@ -10,72 +10,72 @@ def serialize(elem, namespaces={}): return file.getvalue() def test_Element(): - elem = Element(u'a') + elem = Element('a') assert isinstance(elem, Node) - assert elem.tag == u'a' + assert elem.tag == 'a' def test_Element__len__(): - elem = Element(u'a', children=(u'1', u'2', u'3', u'4', u'5')) + elem = Element('a', children=('1', '2', '3', '4', '5')) assert len(elem) == 5 def test_Element__nonzero__(): - elem = Element(u'a') + elem = Element('a') assert elem assert len(elem) == 0 def test_Element___getitem__(): - elem = Element(u'a', children=(Element(u'b'), Element(u'c'))) + elem = Element('a', children=(Element('b'), Element('c'))) - assert elem[0].tag == u'b' - assert elem[1].tag == u'c' + assert elem[0].tag == 'b' + assert elem[1].tag == 'c' assert len(elem[:1]) == 1 assert len(elem[:2]) == 2 assert len(elem[:3]) == 2 assert len(elem[1:3]) == 1 assert len(elem[2:3]) == 0 - assert elem[:2][0].tag == u'b' - assert elem[:2][1].tag == u'c' + assert elem[:2][0].tag == 'b' + assert elem[:2][1].tag == 'c' def test_Element___setitem__(): - elem = Element(u'a', children=(Element(u'b1'), Element(u'b2'))) + elem = Element('a', children=(Element('b1'), Element('b2'))) - elem[0] = Element(u'c') - assert elem[0].tag == u'c' - assert elem[1].tag == u'b2' + elem[0] = Element('c') + assert elem[0].tag == 'c' + assert elem[1].tag == 'b2' - elem[1] = Element(u'd') - assert elem[0].tag == u'c' - assert elem[1].tag == u'd' + elem[1] = Element('d') + assert elem[0].tag == 'c' + assert elem[1].tag == 'd' - elem[0:0] = [Element(u'e')] - assert elem[0].tag == u'e' - assert elem[1].tag == u'c' - assert elem[2].tag == u'd' + elem[0:0] = [Element('e')] + assert elem[0].tag == 'e' + assert elem[1].tag == 'c' + assert elem[2].tag == 'd' def test_Element___delitem__(): - elem = Element(u'a', children=(Element(u'b1'), Element(u'b2'))) + elem = Element('a', children=(Element('b1'), Element('b2'))) del elem[0] assert len(elem) == 1 - assert elem[0].tag == u'b2' + assert elem[0].tag == 'b2' def test_Element_append(): - elem = Element(u'a') + elem = Element('a') - elem.append(Element(u'b')) + elem.append(Element('b')) assert len(elem) == 1 - assert elem[0].tag == u'b' + assert elem[0].tag == 'b' - elem.append(Element(u'c')) + elem.append(Element('c')) assert len(elem) == 2 - assert elem[1].tag == u'c' + assert elem[1].tag == 'c' - elem.append(u'd') + elem.append('d') assert len(elem) == 3 - assert elem[2] == u'd' + assert elem[2] == 'd' def test_Element_extend(): pass @@ -87,181 +87,181 @@ def test_Element_remove(): pass def test_Element_find(): - child_1 = Element(u'b1') - child_2 = Element(u'b2') - elem = Element(u'a', children=(child_1, child_2)) + child_1 = Element('b1') + child_2 = Element('b2') + elem = Element('a', children=(child_1, child_2)) - result = elem.find(u'b1') + result = elem.find('b1') assert result is child_1 - result = elem.find(u'b2') + result = elem.find('b2') assert result is child_2 - child_1 = Element(QName(u'b1', u'url1')) - child_2 = Element(QName(u'{url2}b2')) - elem = Element(u'a', children=(child_1, child_2)) + child_1 = Element(QName('b1', 'url1')) + child_2 = Element(QName('{url2}b2')) + elem = Element('a', children=(child_1, child_2)) - result = elem.find(u'{url1}b1') + result = elem.find('{url1}b1') assert result is child_1 def test_Element_findall(): - child_1 = Element(u'b1') - child_2 = Element(u'b2') - child_3 = u"text" - elem = Element(u'a', children=(child_1, child_2, child_3)) + child_1 = Element('b1') + child_2 = Element('b2') + child_3 = "text" + elem = Element('a', children=(child_1, child_2, child_3)) - result = list(elem.findall(u'b1')) + result = list(elem.findall('b1')) assert len(result) == 1 assert result[0] is child_1 - result = list(elem.findall(u'b2')) + result = list(elem.findall('b2')) assert len(result) == 1 assert result[0] is child_2 - result = list(elem.findall(u'*')) + result = list(elem.findall('*')) assert len(result) == 3 assert result[0] is child_1 assert result[1] is child_2 assert result[2] is child_3 - child_1 = Element(QName(u'b1', u'url1')) - child_2 = Element(QName(u'{url2}b2')) - elem = Element(u'a', children=(child_1, child_2)) + child_1 = Element(QName('b1', 'url1')) + child_2 = Element(QName('{url2}b2')) + elem = Element('a', children=(child_1, child_2)) - result = list(elem.findall(u'{url1}b1')) + result = list(elem.findall('{url1}b1')) assert len(result) == 1 assert result[0] is child_1 def test_Element_findall_tag_multimatch(): - c1 = Element(u'c') - c2 = Element(u'c') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) - - result = list(b1.findall(u'c')) + c1 = Element('c') + c2 = Element('c') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) + + result = list(b1.findall('c')) assert len(result) == 2 assert result[0] is c1 assert result[1] is c2 - result = list(a1.findall(u'c')) + result = list(a1.findall('c')) assert len(result) == 0 # no 'c' childs - result = list(a1.findall(u'*/c')) + result = list(a1.findall('*/c')) assert len(result) == 2 # but 2 'c' grandchilds assert result[0] is c1 assert result[1] is c2 def test_Element_findall_bracketed_tag(): - c1 = Element(u'c') - c2 = Element(u'c') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) - - result = list(b1.findall(u'[c]')) + c1 = Element('c') + c2 = Element('c') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) + + result = list(b1.findall('[c]')) assert len(result) == 1 assert result[0] is b1 # b1 has 'c' childs - result = list(a1.findall(u'*/[c]')) + result = list(a1.findall('*/[c]')) assert len(result) == 1 assert result[0] is b1 # b1 has 'c' childs def test_Element_findall_dotdot(): pytest.skip('broken') - c1 = Element(u'c') - c2 = Element(u'c') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) + c1 = Element('c') + c2 = Element('c') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) - result = list(c1.findall(u'../c')) + result = list(c1.findall('../c')) assert len(result) == 2 assert result[0] is c1 assert result[1] is c2 def test_Element_findall_slashslash(): pytest.skip('broken') - c1 = Element(u'c') - c2 = Element(u'c') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) + c1 = Element('c') + c2 = Element('c') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) a1t = ElementTree(element=a1) # we need a tree to use // - result = list(a1t.findall(u'//c')) + result = list(a1t.findall('//c')) assert len(result) == 2 assert result[0] is c1 assert result[1] is c2 def test_Element_findall_dotslashslash(): pytest.skip('broken') - c1 = Element(u'c') - c2 = Element(u'c') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) - - result = list(a1.findall(u'.//c')) + c1 = Element('c') + c2 = Element('c') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) + + result = list(a1.findall('.//c')) assert len(result) == 2 assert result[0] is c1 assert result[1] is c2 def test_Element_findall_attribute(): - c1 = Element(u'c') - c2 = Element(u'c', testattr='testvalue') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) - - result = list(b1.findall(u"c[@testattr]")) + c1 = Element('c') + c2 = Element('c', testattr='testvalue') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) + + result = list(b1.findall("c[@testattr]")) # note: does not work without c, like b1.findall(u"[@testattr]") - should it? assert len(result) == 1 assert result[0] is c2 - result = list(b1.findall(u"c[@testattr='testvalue']")) + result = list(b1.findall("c[@testattr='testvalue']")) # note: does not work without c, like b1.findall(u"[@testattr='testvalue']") - should it? assert len(result) == 1 assert result[0] is c2 - result = list(b1.findall(u"c[@testattr='othervalue']")) + result = list(b1.findall("c[@testattr='othervalue']")) # note: does not work without c, like b1.findall(u"[@testattr='othervalue']") - should it? assert len(result) == 0 def test_Element_findall_position(): pytest.skip('not supported') - c1 = Element(u'c') - c2 = Element(u'c') - text = u"text" - b1 = Element(u'b', children=(c1, text, c2)) - b2 = Element(u'b') - a1 = Element(u'a', children=(b1, b2, )) - - result = list(b1.findall(u'c[1]')) # note: index is 1-based, [1] (not [0]) is first + c1 = Element('c') + c2 = Element('c') + text = "text" + b1 = Element('b', children=(c1, text, c2)) + b2 = Element('b') + a1 = Element('a', children=(b1, b2, )) + + result = list(b1.findall('c[1]')) # note: index is 1-based, [1] (not [0]) is first assert len(result) == 1 assert result[0] is c1 - result = list(b1.findall(u'c[2]')) + result = list(b1.findall('c[2]')) assert len(result) == 1 assert result[0] is c2 def test_Element_findtext_default(): - elem = Element(u'a') - default_text = u'defaulttext' - result = elem.findtext(u'doesnotexist', default=default_text) + elem = Element('a') + default_text = 'defaulttext' + result = elem.findtext('doesnotexist', default=default_text) assert result is default_text def test_Element_findtext(): - child_text = u"text" - child = Element(u'b', children=(child_text, )) - elem = Element(u'a', children=(child, )) - result = elem.findtext(u'b') + child_text = "text" + child = Element('b', children=(child_text, )) + elem = Element('a', children=(child, )) + result = elem.findtext('b') assert result is child_text def test_Element_clear(): @@ -280,143 +280,143 @@ def test_Element_items(): pass def test_Element_iter(): - elem = Element(u'a') + elem = Element('a') l = list(elem.iter()) assert len(l) == 1 - elem.append(u'b') + elem.append('b') l = list(elem.iter()) assert len(l) == 2 - elem.append(Element(u'c')) + elem.append(Element('c')) l = list(elem.iter()) assert len(l) == 3 - elem.append(u'd') + elem.append('d') l = list(elem.iter()) assert len(l) == 4 def test_Element_itertext(): - elem = Element(u'a') + elem = Element('a') l = list(elem.itertext()) assert len(l) == 0 - elem.append(u'b') + elem.append('b') l = list(elem.itertext()) assert len(l) == 1 def test_Element_iter_elements(): - elem = Element(u'a') + elem = Element('a') assert len(list(elem.iter_elements())) == 0 - elem.append(Element(u'c')) + elem.append(Element('c')) assert len(list(elem.iter_elements())) == 1 - elem.append(u'b') + elem.append('b') assert len(list(elem.iter_elements())) == 1 def test_Element_iter_elements_tree(): - elem = Element(u'a') + elem = Element('a') assert len(list(elem.iter_elements_tree())) == 1 - elem.append(u'b') + elem.append('b') assert len(list(elem.iter_elements_tree())) == 1 - elem.append(Element(u'c')) + elem.append(Element('c')) assert len(list(elem.iter_elements_tree())) == 2 - elem.append(u'd') + elem.append('d') assert len(list(elem.iter_elements_tree())) == 2 def test_Comment(): - elem = Comment(u'a') - assert serialize(elem) == u'' + elem = Comment('a') + assert serialize(elem) == '' assert isinstance(elem, Node) def test_ProcessingInstruction(): - elem = ProcessingInstruction(u'a') - assert serialize(elem) == u'' + elem = ProcessingInstruction('a') + assert serialize(elem) == '' assert isinstance(elem, ProcessingInstruction) - elem = ProcessingInstruction(u'a', u'b') - assert serialize(elem) == u'' + elem = ProcessingInstruction('a', 'b') + assert serialize(elem) == '' def test_QName___init__(): - qname = QName(u'a') + qname = QName('a') assert qname.uri is None - assert qname.name == u'a' + assert qname.name == 'a' assert isinstance(qname.name, str) - assert str(qname) == u'a' + assert str(qname) == 'a' - qname = QName(u'{b}a') - assert qname.uri == u'b' + qname = QName('{b}a') + assert qname.uri == 'b' assert isinstance(qname.uri, str) - assert qname.name == u'a' - assert str(qname) == u'{b}a' + assert qname.name == 'a' + assert str(qname) == '{b}a' - qname = QName(u'a', u'b') - assert qname.uri == u'b' - assert qname.name == u'a' - assert str(qname) == u'{b}a' + qname = QName('a', 'b') + assert qname.uri == 'b' + assert qname.name == 'a' + assert str(qname) == '{b}a' - pytest.raises(ValueError, QName, u'{bau') - pytest.raises(ValueError, QName, u'{b}a', u'c') + pytest.raises(ValueError, QName, '{bau') + pytest.raises(ValueError, QName, '{b}a', 'c') def test_QName___cmp__(): - qname1 = QName(u'a') - qname2 = QName(u'a') + qname1 = QName('a') + qname2 = QName('a') assert qname1 == qname2 - assert qname1 == u'a' - assert u'a' == qname1 + assert qname1 == 'a' + assert 'a' == qname1 - qname1 = QName(u'a', u'b') - qname2 = QName(u'{b}a') + qname1 = QName('a', 'b') + qname2 = QName('{b}a') assert qname1 == qname2 - assert qname1 == u'{b}a' - assert u'{b}a' == qname1 + assert qname1 == '{b}a' + assert '{b}a' == qname1 def test_XMLParser_simple1(): - elem = XML(u'') - assert elem.tag == u'a' + elem = XML('') + assert elem.tag == 'a' assert len(elem) == 0 def test_XMLParser_simple2(): - elem = XML(u'') - assert elem.tag == u'a' + elem = XML('') + assert elem.tag == 'a' assert len(elem) == 1 - assert elem[0].tag == u'b' + assert elem[0].tag == 'b' assert len(elem[0]) == 0 def test_XMLParser_text1(): - elem = XML(u'b') - assert elem.tag == u'a' + elem = XML('b') + assert elem.tag == 'a' assert isinstance(elem, Element) assert len(elem) == 1 - assert elem[0] == u'b' + assert elem[0] == 'b' assert isinstance(elem[0], str) def test_XMLParser_text2(): - elem = XML(u'bdd') - assert elem.tag == u'a' + elem = XML('bdd') + assert elem.tag == 'a' assert len(elem) == 3 - assert elem[0] == u'b' - assert elem[1].tag == u'c' - assert elem[2] == u'd' + assert elem[0] == 'b' + assert elem[1].tag == 'c' + assert elem[2] == 'd' def test_XMLParser_namespace_1(): - elem = XML(u'') + elem = XML('') assert isinstance(elem.tag, QName) - assert elem.tag == QName(u'b', u'c') - assert elem.attrib == {QName(u'd', None): u'e'} - assert serialize(elem) == u'' - assert serialize(elem, namespaces={u'c': u''}) == u'' + assert elem.tag == QName('b', 'c') + assert elem.attrib == {QName('d', None): 'e'} + assert serialize(elem) == '' + assert serialize(elem, namespaces={'c': ''}) == '' def test_XMLParser_namespace_2(): - elem = XML(u'') + elem = XML('') assert isinstance(elem.tag, QName) - assert elem.tag == QName(u'b', u'c') - assert elem.attrib == {u'd': u'e', QName(u'f', u'c'): u'g'} - assert serialize(elem) == u'' - assert serialize(elem, namespaces={u'c': u''}) == u'' + assert elem.tag == QName('b', 'c') + assert elem.attrib == {'d': 'e', QName('f', 'c'): 'g'} + assert serialize(elem) == '' + assert serialize(elem, namespaces={'c': ''}) == '' diff --git a/emeraldtree/tree.py b/emeraldtree/tree.py index 865adc3..817566b 100644 --- a/emeraldtree/tree.py +++ b/emeraldtree/tree.py @@ -70,7 +70,7 @@ class ParseError(SyntaxError): # -------------------------------------------------------------------- -class Node(object): +class Node: """ Node class. """ @@ -153,7 +153,7 @@ def __init__(self, tag, attrib=None, children=(), **extra): self._children = list(children) def __repr__(self): - return "" % (repr(self.tag), id(self)) + return "".format(repr(self.tag), id(self)) ## # Returns the number of subelements. @@ -368,8 +368,7 @@ def iter(self, tag=None): def itertext(self): for e in self: if isinstance(e, Element): - for s in e.itertext(): - yield s + yield from e.itertext() elif isinstance(e, str): yield e @@ -487,7 +486,7 @@ def __getstate__(self): pass def __repr__(self): - return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.uri) + return '{}({!r}, {!r})'.format(self.__class__.__name__, self.name, self.uri) def __setattr__(self, key, value): raise AttributeError('read-only') @@ -504,7 +503,7 @@ def __setattr__(self, key, value): # @keyparam file Optional file handle or file name. If given, the # tree is initialized with the contents of this XML file. -class ElementTree(object): +class ElementTree: def __init__(self, element=None, file=None): assert element is None or isinstance(element, Node) @@ -680,7 +679,7 @@ def tostring(element, encoding=None, method=None): # @since 1.3 def tostringlist(element, encoding=None, method=None): - class dummy(object): + class dummy: pass data = [] file = dummy() @@ -742,7 +741,7 @@ def iterparse(source, events=None, parser=None): parser = XMLParser(target=TreeBuilder()) return _IterParseIterator(source, events, parser) -class _IterParseIterator(object): +class _IterParseIterator: def __init__(self, source, events, parser): self._file = source @@ -889,7 +888,7 @@ def fromstringlist(sequence, parser=None): # @param element_factory Optional element factory. This factory # is called to create new Element instances, as necessary. -class TreeBuilder(object): +class TreeBuilder: def __init__(self, element_factory=None): self._data = [] # data collector @@ -958,7 +957,7 @@ def end(self, tag): self._flush() self._last = self._elem.pop() assert self._last.tag == tag,\ - "end tag mismatch (expected %s, got %s)" % ( + "end tag mismatch (expected {}, got {})".format( self._last.tag, tag) return self._last @@ -975,7 +974,7 @@ def end(self, tag): # @see #ElementTree # @see #TreeBuilder -class XMLParser(object): +class XMLParser: def __init__(self, html=0, target=None, encoding=None): try: @@ -1127,7 +1126,7 @@ def close(self): del self.target, self._parser # get rid of circular references return tree -class BaseWriter(object): +class BaseWriter: def __init__(self, encoding=None, namespaces={}): self.encoding = encoding self.namespaces = namespaces @@ -1181,7 +1180,7 @@ def add_qname(qname): if prefix != "xml": used_namespaces[uri] = prefix if prefix: - qnames[qname] = "%s:%s" % (prefix, qname.name) + qnames[qname] = "{}:{}".format(prefix, qname.name) else: qnames[qname] = qname.name else: @@ -1214,7 +1213,7 @@ def add_qname(qname): @staticmethod def _raise_serialization_error(text): raise TypeError( - "cannot serialize %r (type %s)" % (text, type(text).__name__) + "cannot serialize {!r} (type {})".format(text, type(text).__name__) ) ## @@ -1231,7 +1230,7 @@ def _raise_serialization_error(text): @classmethod def register_namespace(cls, prefix, uri): import re - if re.match("ns\d+$", prefix): + if re.match(r"ns\d+$", prefix): raise ValueError("Prefix format reserved for internal use") for k, v in cls._namespace_map.items(): if k == uri or v == prefix: @@ -1282,7 +1281,7 @@ class MLBaseWriter(BaseWriter): def _attrib_string(self, d, qnames): """create a attribute string from a dict d""" if not d: - return u'' + return '' items = sorted(d.items(), key=lambda x: x[0]) result = [] for k, v in items: @@ -1292,32 +1291,32 @@ def _attrib_string(self, d, qnames): else: v = self._escape_attrib(str(v)) # FIXME: handle boolean attributes for HTML - result.append(u' %s="%s"' % (k, v)) - return u''.join(result) + result.append(' {}="{}"'.format(k, v)) + return ''.join(result) def _namespace_string(self, d): """create a namespace string from a dict d""" if not d: - return u'' + return '' items = sorted(d.items(), key=lambda x: x[1]) # sort on prefix result = [] for v, k in items: if k: - k = u':' + k - result.append(u' xmlns%s="%s"' % (k, self._escape_attrib(v))) - return u''.join(result) + k = ':' + k + result.append(' xmlns{}="{}"'.format(k, self._escape_attrib(v))) + return ''.join(result) def _serialize_element(self, write, elem, qnames, namespaces): raise NotImplementedError def _serialize_comment(self, write, elem): - write(u"" % self._escape_cdata(elem.text)) + write("" % self._escape_cdata(elem.text)) def _serialize_pi(self, write, elem): text = self._escape_cdata(elem.target) if elem.text is not None: text += ' ' + self._escape_cdata(elem.text) - write(u"" % text) + write("" % text) def _serialize_cdata(self, write, elem): write(self._escape_cdata(str(elem))) @@ -1341,12 +1340,12 @@ def _serialize_element(self, write, elem, qnames, namespaces): attrib_str = self._attrib_string(elem.attrib, qnames) namespace_str = self._namespace_string(namespaces) if len(elem): - write(u"<%s%s%s>" % (tag, attrib_str, namespace_str)) + write("<{}{}{}>".format(tag, attrib_str, namespace_str)) for e in elem: self.serialize(write, e, qnames) - write(u"" % tag) + write("" % tag) else: - write(u"<%s%s%s />" % (tag, attrib_str, namespace_str)) + write("<{}{}{} />".format(tag, attrib_str, namespace_str)) else: for e in elem: @@ -1354,7 +1353,7 @@ def _serialize_element(self, write, elem, qnames, namespaces): def serialize_document_start(self, write): if self.encoding and self.encoding not in ("utf-8", "us-ascii"): - write(u"\n" % self.encoding) + write("\n" % self.encoding) class HTMLWriter(MLBaseWriter): @@ -1363,7 +1362,7 @@ class HTMLWriter(MLBaseWriter): def __init__(self, encoding=None, namespaces={}): namespaces["http://www.w3.org/1999/xhtml"] = '' - super(HTMLWriter, self).__init__(encoding, namespaces) + super().__init__(encoding, namespaces) def _serialize_element(self, write, elem, qnames, namespaces): tag = qnames[elem.tag] @@ -1371,14 +1370,14 @@ def _serialize_element(self, write, elem, qnames, namespaces): if tag is not None: attrib_str = self._attrib_string(elem.attrib, qnames) namespace_str = self._namespace_string(namespaces) - write(u"<%s%s%s>" % (tag, attrib_str, namespace_str)) + write("<{}{}{}>".format(tag, attrib_str, namespace_str)) if tag.lower() in ('script', 'style'): - write(u''.join(elem.itertext())) + write(''.join(elem.itertext())) else: for e in elem: self.serialize(write, e, qnames) if tag not in self.empty_elements: - write(u"" % tag) + write("" % tag) else: for e in elem: @@ -1394,7 +1393,7 @@ class PolyglotWriter(MLBaseWriter): def __init__(self, encoding=None, namespaces={}): namespaces["http://www.w3.org/1999/xhtml"] = '' - super(PolyglotWriter, self).__init__(encoding, namespaces) + super().__init__(encoding, namespaces) def _serialize_element(self, write, elem, qnames, namespaces): tag = qnames[elem.tag] @@ -1403,19 +1402,19 @@ def _serialize_element(self, write, elem, qnames, namespaces): attrib_str = self._attrib_string(elem.attrib, qnames) namespace_str = self._namespace_string(namespaces) if len(elem): - write(u"<%s%s%s>" % (tag, attrib_str, namespace_str)) + write("<{}{}{}>".format(tag, attrib_str, namespace_str)) for e in elem: self.serialize(write, e, qnames) - write(u"" % tag) + write("" % tag) elif tag in self.void_elements: - write(u"<%s%s%s />" % (tag, attrib_str, namespace_str)) + write("<{}{}{} />".format(tag, attrib_str, namespace_str)) else: - write(u"<%s%s%s>" % (tag, attrib_str, namespace_str, tag)) + write("<{}{}{}>".format(tag, attrib_str, namespace_str, tag)) else: for e in elem: self.serialize(write, e, qnames) def serialize_document_start(self, write): - write(u"\n") + write("\n")