Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions stdlib/xml/etree/ElementPath.pyi
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from collections.abc import Callable, Generator, Iterable
from re import Pattern
from typing import Any, Final, Literal, TypeVar, overload
from typing import Final, Literal, TypeVar, overload
from typing_extensions import TypeAlias
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import Element, QName

xpath_tokenizer_re: Final[Pattern[str]]

Expand All @@ -29,13 +29,13 @@ class _SelectorContext:

@overload
def iterfind( # type: ignore[overload-overlap]
elem: Element[Any], path: Literal[""], namespaces: dict[str, str] | None = None
elem: Element, path: Literal[""], namespaces: dict[str, str] | None = None
) -> None: ...
@overload
def iterfind(elem: Element[Any], path: str, namespaces: dict[str, str] | None = None) -> Generator[Element, None, None]: ...
def find(elem: Element[Any], path: str, namespaces: dict[str, str] | None = None) -> Element | None: ...
def findall(elem: Element[Any], path: str, namespaces: dict[str, str] | None = None) -> list[Element]: ...
def iterfind(elem: Element, path: str, namespaces: dict[str, str] | None = None) -> Generator[Element]: ...
def find(elem: Element, path: str, namespaces: dict[str, str] | None = None) -> Element | None: ...
def findall(elem: Element, path: str, namespaces: dict[str, str] | None = None) -> list[Element]: ...
@overload
def findtext(elem: Element[Any], path: str, default: None = None, namespaces: dict[str, str] | None = None) -> str | None: ...
def findtext(elem: Element, path: str, default: None = None, namespaces: dict[str, str] | None = None) -> str | QName | None: ...
@overload
def findtext(elem: Element[Any], path: str, default: _T, namespaces: dict[str, str] | None = None) -> _T | str: ...
def findtext(elem: Element, path: str, default: _T, namespaces: dict[str, str] | None = None) -> _T | str | QName: ...
86 changes: 45 additions & 41 deletions stdlib/xml/etree/ElementTree.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -79,45 +79,48 @@ def canonicalize(

# The tag for Element can be set to the Comment or ProcessingInstruction
# functions defined in this module.
_ElementCallable: TypeAlias = Callable[..., Element[_ElementCallable]]
_ElementCallable: TypeAlias = Callable[..., Element]

_Tag = TypeVar("_Tag", default=str, bound=str | _ElementCallable)
_OtherTag = TypeVar("_OtherTag", default=str, bound=str | _ElementCallable)
# Name values can be str or str wrapped in a QName instance
_NameType: TypeAlias = str | QName
_TagType: TypeAlias = _NameType | _ElementCallable

@disjoint_base
class Element(Generic[_Tag]):
tag: _Tag
attrib: dict[str, str]
text: str | None
class Element:
tag: _TagType | None
attrib: dict[_NameType, _NameType]
text: _NameType | None
tail: str | None
def __init__(self, tag: _Tag, attrib: dict[str, str] = {}, **extra: str) -> None: ...
def append(self, subelement: Element[Any], /) -> None: ...
def __init__(
self, tag: _TagType | None, attrib: Mapping[_NameType, _NameType] | Mapping[str, str] = {}, **extra: _NameType
) -> None: ...
def append(self, subelement: Element, /) -> None: ...
def clear(self) -> None: ...
def extend(self, elements: Iterable[Element], /) -> None: ...
def find(self, path: str, namespaces: dict[str, str] | None = None) -> Element | None: ...
def findall(self, path: str, namespaces: dict[str, str] | None = None) -> list[Element]: ...
@overload
def findtext(self, path: str, default: None = None, namespaces: dict[str, str] | None = None) -> str | None: ...
def findtext(self, path: str, default: None = None, namespaces: dict[str, str] | None = None) -> _NameType | None: ...
@overload
def findtext(self, path: str, default: _T, namespaces: dict[str, str] | None = None) -> _T | str: ...
def findtext(self, path: str, default: _T, namespaces: dict[str, str] | None = None) -> _T | _NameType: ...
@overload
def get(self, key: str, default: None = None) -> str | None: ...
def get(self, key: _NameType, default: None = None) -> _NameType | None: ...
@overload
def get(self, key: str, default: _T) -> str | _T: ...
def get(self, key: _NameType, default: _T) -> _NameType | _T: ...
def insert(self, index: int, subelement: Element, /) -> None: ...
def items(self) -> ItemsView[str, str]: ...
def iter(self, tag: str | None = None) -> Generator[Element, None, None]: ...
def items(self) -> ItemsView[_NameType, _NameType]: ...
def iter(self, tag: _TagType | None = None) -> Generator[Element]: ...
@overload
def iterfind(self, path: Literal[""], namespaces: dict[str, str] | None = None) -> None: ... # type: ignore[overload-overlap]
@overload
def iterfind(self, path: str, namespaces: dict[str, str] | None = None) -> Generator[Element, None, None]: ...
def itertext(self) -> Generator[str, None, None]: ...
def keys(self) -> dict_keys[str, str]: ...
def iterfind(self, path: str, namespaces: dict[str, str] | None = None) -> Generator[Element]: ...
def itertext(self) -> Generator[str]: ...
def keys(self) -> dict_keys[_NameType, _NameType]: ...
# makeelement returns the type of self in Python impl, but not in C impl
def makeelement(self, tag: _OtherTag, attrib: dict[str, str], /) -> Element[_OtherTag]: ...
def makeelement(self, tag: _TagType | None, attrib: Mapping[_NameType, _NameType] | Mapping[str, str], /) -> Element: ...
def remove(self, subelement: Element, /) -> None: ...
def set(self, key: str, value: str, /) -> None: ...
def __copy__(self) -> Element[_Tag]: ... # returns the type of self in Python impl, but not in C impl
def set(self, key: _NameType, value: _NameType, /) -> None: ...
def __copy__(self) -> Element: ... # returns the type of self in Python impl, but not in C impl
def __deepcopy__(self, memo: Any, /) -> Element: ... # Only exists in C impl
def __delitem__(self, key: SupportsIndex | slice, /) -> None: ...
@overload
Expand All @@ -136,9 +139,11 @@ class Element(Generic[_Tag]):
@deprecated("Testing an element's truth value is deprecated.")
def __bool__(self) -> bool: ...

def SubElement(parent: Element, tag: str, attrib: dict[str, str] = ..., **extra: str) -> Element: ...
def Comment(text: str | None = None) -> Element[_ElementCallable]: ...
def ProcessingInstruction(target: str, text: str | None = None) -> Element[_ElementCallable]: ...
def SubElement(
parent: Element, tag: _TagType | None, attrib: Mapping[_NameType, _NameType] | Mapping[str, str] = ..., **extra: _NameType
) -> Element: ...
def Comment(text: str | None = None) -> Element: ...
def ProcessingInstruction(target: str, text: str | None = None) -> Element: ...

PI = ProcessingInstruction

Expand All @@ -152,18 +157,16 @@ class QName:
def __eq__(self, other: object) -> bool: ...
def __hash__(self) -> int: ...

_Root = TypeVar("_Root", Element, Element | None, default=Element | None)

class ElementTree(Generic[_Root]):
class ElementTree:
def __init__(self, element: Element | None = None, file: _FileRead | None = None) -> None: ...
def getroot(self) -> _Root: ...
def getroot(self) -> Element: ...
def parse(self, source: _FileRead, parser: XMLParser | None = None) -> Element: ...
def iter(self, tag: str | None = None) -> Generator[Element, None, None]: ...
def iter(self, tag: _TagType | None = None) -> Generator[Element]: ...
def find(self, path: str, namespaces: dict[str, str] | None = None) -> Element | None: ...
@overload
def findtext(self, path: str, default: None = None, namespaces: dict[str, str] | None = None) -> str | None: ...
def findtext(self, path: str, default: None = None, namespaces: dict[str, str] | None = None) -> _NameType | None: ...
@overload
def findtext(self, path: str, default: _T, namespaces: dict[str, str] | None = None) -> _T | str: ...
def findtext(self, path: str, default: _T, namespaces: dict[str, str] | None = None) -> _T | _NameType: ...
def findall(self, path: str, namespaces: dict[str, str] | None = None) -> list[Element]: ...
@overload
def iterfind(self, path: Literal[""], namespaces: dict[str, str] | None = None) -> None: ... # type: ignore[overload-overlap]
Expand Down Expand Up @@ -244,13 +247,14 @@ def tostringlist(
default_namespace: str | None = None,
short_empty_elements: bool = True,
) -> list[Any]: ...
def dump(elem: Element | ElementTree[Any]) -> None: ...
def indent(tree: Element | ElementTree[Any], space: str = " ", level: int = 0) -> None: ...
def parse(source: _FileRead, parser: XMLParser[Any] | None = None) -> ElementTree[Element]: ...
def dump(elem: Element | ElementTree) -> None: ...
def indent(tree: Element | ElementTree, space: str = " ", level: int = 0) -> None: ...
def parse(source: _FileRead, parser: XMLParser[Any] | None = None) -> ElementTree: ...

# This class is defined inside the body of iterparse
@type_check_only
class _IterParseIterator(Iterator[tuple[str, Element]], Protocol):
root: Element | None
def __next__(self) -> tuple[str, Element]: ...
if sys.version_info >= (3, 13):
def close(self) -> None: ...
Expand All @@ -262,14 +266,14 @@ def iterparse(source: _FileRead, events: Sequence[str] | None = None, parser: XM
_EventQueue: TypeAlias = tuple[str] | tuple[str, tuple[str, str]] | tuple[str, None]

class XMLPullParser(Generic[_E]):
def __init__(self, events: Sequence[str] | None = None, *, _parser: XMLParser[_E] | None = None) -> None: ...
def __init__(self, events: Iterable[str] | None = None, *, _parser: XMLParser[_E] | None = None) -> None: ...
def feed(self, data: str | ReadableBuffer) -> None: ...
def close(self) -> None: ...
def read_events(self) -> Iterator[_EventQueue | tuple[str, _E]]: ...
def flush(self) -> None: ...

def XML(text: str | ReadableBuffer, parser: XMLParser | None = None) -> Element: ...
def XMLID(text: str | ReadableBuffer, parser: XMLParser | None = None) -> tuple[Element, dict[str, Element]]: ...
def XMLID(text: str | ReadableBuffer, parser: XMLParser | None = None) -> tuple[Element, dict[_NameType, Element]]: ...

# This is aliased to XML in the source.
fromstring = XML
Expand All @@ -294,8 +298,8 @@ class TreeBuilder:
self,
element_factory: _ElementFactory | None = None,
*,
comment_factory: Callable[[str | None], Element[Any]] | None = None,
pi_factory: Callable[[str, str | None], Element[Any]] | None = None,
comment_factory: Callable[[str | None], Element] | None = None,
pi_factory: Callable[[str, str | None], Element] | None = None,
insert_comments: bool = False,
insert_pis: bool = False,
) -> None: ...
Expand All @@ -307,10 +311,10 @@ class TreeBuilder:
# tag and attrs are passed to the element_factory, so they could be anything
# depending on what the particular factory supports.
def start(self, tag: Any, attrs: dict[Any, Any], /) -> Element: ...
def end(self, tag: str, /) -> Element: ...
def end(self, tag: _TagType, /) -> Element: ...
# These two methods have pos-only parameters in the C implementation
def comment(self, text: str | None, /) -> Element[Any]: ...
def pi(self, target: str, text: str | None = None, /) -> Element[Any]: ...
def comment(self, text: str | None, /) -> Element: ...
def pi(self, target: str, text: str | None = None, /) -> Element: ...

class C14NWriterTarget:
def __init__(
Expand Down
Loading