🌐 AI搜索 & 代理 主页
Skip to content

Commit 4262f4d

Browse files
committed
modn: improve type annotation
1 parent 3228bc5 commit 4262f4d

File tree

9 files changed

+51
-57
lines changed

9 files changed

+51
-57
lines changed

src/docx/opc/coreprops.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from __future__ import annotations
77

8+
import datetime as dt
89
from typing import TYPE_CHECKING
910

1011
from docx.oxml.coreprops import CT_CoreProperties
@@ -57,7 +58,7 @@ def created(self):
5758
return self._element.created_datetime
5859

5960
@created.setter
60-
def created(self, value):
61+
def created(self, value: dt.datetime):
6162
self._element.created_datetime = value
6263

6364
@property
@@ -97,23 +98,23 @@ def last_printed(self):
9798
return self._element.lastPrinted_datetime
9899

99100
@last_printed.setter
100-
def last_printed(self, value):
101+
def last_printed(self, value: dt.datetime):
101102
self._element.lastPrinted_datetime = value
102103

103104
@property
104105
def modified(self):
105106
return self._element.modified_datetime
106107

107108
@modified.setter
108-
def modified(self, value):
109+
def modified(self, value: dt.datetime):
109110
self._element.modified_datetime = value
110111

111112
@property
112113
def revision(self):
113114
return self._element.revision_number
114115

115116
@revision.setter
116-
def revision(self, value):
117+
def revision(self, value: int):
117118
self._element.revision_number = value
118119

119120
@property

src/docx/opc/oxml.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def parse_xml(text: str) -> etree._Element:
3838
return etree.fromstring(text, oxml_parser)
3939

4040

41-
def qn(tag):
41+
def qn(tag: str) -> str:
4242
"""Stands for "qualified name", a utility function to turn a namespace prefixed tag
4343
name into a Clark-notation qualified tag name for lxml.
4444
@@ -50,7 +50,7 @@ def qn(tag):
5050
return "{%s}%s" % (uri, tagroot)
5151

5252

53-
def serialize_part_xml(part_elm: etree._Element):
53+
def serialize_part_xml(part_elm: etree._Element) -> bytes:
5454
"""Serialize `part_elm` etree element to XML suitable for storage as an XML part.
5555
5656
That is to say, no insignificant whitespace added for readability, and an
@@ -59,7 +59,7 @@ def serialize_part_xml(part_elm: etree._Element):
5959
return etree.tostring(part_elm, encoding="UTF-8", standalone=True)
6060

6161

62-
def serialize_for_reading(element):
62+
def serialize_for_reading(element: etree._Element) -> str:
6363
"""Serialize `element` to human-readable XML suitable for tests.
6464
6565
No XML declaration.
@@ -77,7 +77,7 @@ class BaseOxmlElement(etree.ElementBase):
7777
classes in one place."""
7878

7979
@property
80-
def xml(self):
80+
def xml(self) -> str:
8181
"""Return XML string for this element, suitable for testing purposes.
8282
8383
Pretty printed for readability and without an XML declaration at the top.
@@ -86,8 +86,10 @@ def xml(self):
8686

8787

8888
class CT_Default(BaseOxmlElement):
89-
"""``<Default>`` element, specifying the default content type to be applied to a
90-
part with the specified extension."""
89+
"""`<Default>` element that appears in `[Content_Types].xml` part.
90+
91+
Used to specify a default content type to be applied to any part with the specified extension.
92+
"""
9193

9294
@property
9395
def content_type(self):
@@ -101,9 +103,8 @@ def extension(self):
101103
return self.get("Extension")
102104

103105
@staticmethod
104-
def new(ext, content_type):
105-
"""Return a new ``<Default>`` element with attributes set to parameter
106-
values."""
106+
def new(ext: str, content_type: str):
107+
"""Return a new ``<Default>`` element with attributes set to parameter values."""
107108
xml = '<Default xmlns="%s"/>' % nsmap["ct"]
108109
default = parse_xml(xml)
109110
default.set("Extension", ext)
@@ -123,8 +124,7 @@ def content_type(self):
123124

124125
@staticmethod
125126
def new(partname, content_type):
126-
"""Return a new ``<Override>`` element with attributes set to parameter
127-
values."""
127+
"""Return a new ``<Override>`` element with attributes set to parameter values."""
128128
xml = '<Override xmlns="%s"/>' % nsmap["ct"]
129129
override = parse_xml(xml)
130130
override.set("PartName", partname)
@@ -138,8 +138,7 @@ def partname(self):
138138

139139

140140
class CT_Relationship(BaseOxmlElement):
141-
"""``<Relationship>`` element, representing a single relationship from a source to a
142-
target part."""
141+
"""`<Relationship>` element, representing a single relationship from source to target part."""
143142

144143
@staticmethod
145144
def new(rId: str, reltype: str, target: str, target_mode: str = RTM.INTERNAL):

src/docx/oxml/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
register_element_cls("w:jc", CT_Jc)
235235
register_element_cls("w:keepLines", CT_OnOff)
236236
register_element_cls("w:keepNext", CT_OnOff)
237+
register_element_cls("w:outlineLvl", CT_DecimalNumber)
237238
register_element_cls("w:pageBreakBefore", CT_OnOff)
238239
register_element_cls("w:pPr", CT_PPr)
239240
register_element_cls("w:pStyle", CT_String)

src/docx/oxml/coreprops.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import datetime as dt
66
import re
7-
from typing import TYPE_CHECKING, Any, Callable
7+
from typing import TYPE_CHECKING, Any, Callable, cast
88

99
from docx.oxml.ns import nsdecls, qn
1010
from docx.oxml.parser import parse_xml
@@ -45,14 +45,14 @@ class CT_CoreProperties(BaseOxmlElement):
4545
_coreProperties_tmpl = "<cp:coreProperties %s/>\n" % nsdecls("cp", "dc", "dcterms")
4646

4747
@classmethod
48-
def new(cls):
48+
def new(cls) -> CT_CoreProperties:
4949
"""Return a new `<cp:coreProperties>` element."""
5050
xml = cls._coreProperties_tmpl
51-
coreProperties = parse_xml(xml)
51+
coreProperties = cast(CT_CoreProperties, parse_xml(xml))
5252
return coreProperties
5353

5454
@property
55-
def author_text(self):
55+
def author_text(self) -> str:
5656
"""The text in the `dc:creator` child element."""
5757
return self._text_of_element("creator")
5858

@@ -77,55 +77,55 @@ def comments_text(self, value: str):
7777
self._set_element_text("description", value)
7878

7979
@property
80-
def contentStatus_text(self):
80+
def contentStatus_text(self) -> str:
8181
return self._text_of_element("contentStatus")
8282

8383
@contentStatus_text.setter
8484
def contentStatus_text(self, value: str):
8585
self._set_element_text("contentStatus", value)
8686

8787
@property
88-
def created_datetime(self):
88+
def created_datetime(self) -> dt.datetime | None:
8989
return self._datetime_of_element("created")
9090

9191
@created_datetime.setter
9292
def created_datetime(self, value: dt.datetime):
9393
self._set_element_datetime("created", value)
9494

9595
@property
96-
def identifier_text(self):
96+
def identifier_text(self) -> str:
9797
return self._text_of_element("identifier")
9898

9999
@identifier_text.setter
100100
def identifier_text(self, value: str):
101101
self._set_element_text("identifier", value)
102102

103103
@property
104-
def keywords_text(self):
104+
def keywords_text(self) -> str:
105105
return self._text_of_element("keywords")
106106

107107
@keywords_text.setter
108108
def keywords_text(self, value: str):
109109
self._set_element_text("keywords", value)
110110

111111
@property
112-
def language_text(self):
112+
def language_text(self) -> str:
113113
return self._text_of_element("language")
114114

115115
@language_text.setter
116116
def language_text(self, value: str):
117117
self._set_element_text("language", value)
118118

119119
@property
120-
def lastModifiedBy_text(self):
120+
def lastModifiedBy_text(self) -> str:
121121
return self._text_of_element("lastModifiedBy")
122122

123123
@lastModifiedBy_text.setter
124124
def lastModifiedBy_text(self, value: str):
125125
self._set_element_text("lastModifiedBy", value)
126126

127127
@property
128-
def lastPrinted_datetime(self):
128+
def lastPrinted_datetime(self) -> dt.datetime | None:
129129
return self._datetime_of_element("lastPrinted")
130130

131131
@lastPrinted_datetime.setter
@@ -141,7 +141,7 @@ def modified_datetime(self, value: dt.datetime):
141141
self._set_element_datetime("modified", value)
142142

143143
@property
144-
def revision_number(self):
144+
def revision_number(self) -> int:
145145
"""Integer value of revision property."""
146146
revision = self.revision
147147
if revision is None:
@@ -167,23 +167,23 @@ def revision_number(self, value: int):
167167
revision.text = str(value)
168168

169169
@property
170-
def subject_text(self):
170+
def subject_text(self) -> str:
171171
return self._text_of_element("subject")
172172

173173
@subject_text.setter
174174
def subject_text(self, value: str):
175175
self._set_element_text("subject", value)
176176

177177
@property
178-
def title_text(self):
178+
def title_text(self) -> str:
179179
return self._text_of_element("title")
180180

181181
@title_text.setter
182182
def title_text(self, value: str):
183183
self._set_element_text("title", value)
184184

185185
@property
186-
def version_text(self):
186+
def version_text(self) -> str:
187187
return self._text_of_element("version")
188188

189189
@version_text.setter
@@ -257,7 +257,7 @@ def _parse_W3CDTF_to_datetime(cls, w3cdtf_str: str) -> dt.datetime:
257257
dt_ = cls._offset_dt(dt_, offset_str)
258258
return dt_.replace(tzinfo=dt.timezone.utc)
259259

260-
def _set_element_datetime(self, prop_name: str, value: dt.datetime):
260+
def _set_element_datetime(self, prop_name: str, value: dt.datetime) -> None:
261261
"""Set date/time value of child element having `prop_name` to `value`."""
262262
if not isinstance(value, dt.datetime): # pyright: ignore[reportUnnecessaryIsInstance]
263263
tmpl = "property requires <type 'datetime.datetime'> object, got %s"

src/docx/oxml/ns.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from typing import Any, Dict
5+
from typing import Dict
66

77
nsmap = {
88
"a": "http://schemas.openxmlformats.org/drawingml/2006/main",
@@ -29,7 +29,7 @@
2929
class NamespacePrefixedTag(str):
3030
"""Value object that knows the semantics of an XML tag having a namespace prefix."""
3131

32-
def __new__(cls, nstag: str, *args: Any):
32+
def __new__(cls, nstag: str):
3333
return super(NamespacePrefixedTag, cls).__new__(cls, nstag)
3434

3535
def __init__(self, nstag: str):

src/docx/oxml/shape.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,8 @@ class CT_Picture(BaseOxmlElement):
145145
spPr: CT_ShapeProperties = OneAndOnlyOne("pic:spPr") # pyright: ignore[reportAssignmentType]
146146

147147
@classmethod
148-
def new(cls, pic_id, filename, rId, cx, cy):
149-
"""Return a new ``<pic:pic>`` element populated with the minimal contents
150-
required to define a viable picture element, based on the values passed as
151-
parameters."""
148+
def new(cls, pic_id: int, filename: str, rId: str, cx: Length, cy: Length) -> CT_Picture:
149+
"""A new minimum viable `<pic:pic>` (picture) element."""
152150
pic = parse_xml(cls._pic_xml())
153151
pic.nvPicPr.cNvPr.id = pic_id
154152
pic.nvPicPr.cNvPr.name = filename

src/docx/oxml/text/parfmt.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
WD_TAB_ALIGNMENT,
1111
WD_TAB_LEADER,
1212
)
13+
from docx.oxml.shared import CT_DecimalNumber
1314
from docx.oxml.simpletypes import ST_SignedTwipsMeasure, ST_TwipsMeasure
1415
from docx.oxml.xmlchemy import (
1516
BaseOxmlElement,
@@ -55,6 +56,7 @@ class CT_PPr(BaseOxmlElement):
5556

5657
get_or_add_ind: Callable[[], CT_Ind]
5758
get_or_add_pStyle: Callable[[], CT_String]
59+
get_or_add_sectPr: Callable[[], CT_SectPr]
5860
_insert_sectPr: Callable[[CT_SectPr], None]
5961
_remove_pStyle: Callable[[], None]
6062
_remove_sectPr: Callable[[], None]
@@ -111,6 +113,9 @@ class CT_PPr(BaseOxmlElement):
111113
"w:ind", successors=_tag_seq[23:]
112114
)
113115
jc = ZeroOrOne("w:jc", successors=_tag_seq[27:])
116+
outlineLvl: CT_DecimalNumber = ZeroOrOne( # pyright: ignore[reportAssignmentType]
117+
"w:outlineLvl", successors=_tag_seq[31:]
118+
)
114119
sectPr = ZeroOrOne("w:sectPr", successors=_tag_seq[35:])
115120
del _tag_seq
116121

src/docx/oxml/xmlchemy.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,7 @@
55
from __future__ import annotations
66

77
import re
8-
from typing import (
9-
TYPE_CHECKING,
10-
Any,
11-
Callable,
12-
Dict,
13-
List,
14-
Sequence,
15-
Tuple,
16-
Type,
17-
TypeVar,
18-
)
8+
from typing import TYPE_CHECKING, Any, Callable, Sequence, Type, TypeVar
199

2010
from lxml import etree
2111
from lxml.etree import ElementBase, _Element # pyright: ignore[reportPrivateUsage]
@@ -65,7 +55,7 @@ def __eq__(self, other: object) -> bool:
6555
def __ne__(self, other: object) -> bool:
6656
return not self.__eq__(other)
6757

68-
def _attr_seq(self, attrs: str) -> List[str]:
58+
def _attr_seq(self, attrs: str) -> list[str]:
6959
"""Return a sequence of attribute strings parsed from `attrs`.
7060
7161
Each attribute string is stripped of whitespace on both ends.
@@ -90,7 +80,7 @@ def _eq_elm_strs(self, line: str, line_2: str):
9080
return True
9181

9282
@classmethod
93-
def _parse_line(cls, line: str) -> Tuple[str, str, str, str]:
83+
def _parse_line(cls, line: str) -> tuple[str, str, str, str]:
9484
"""(front, attrs, close, text) 4-tuple result of parsing XML element `line`."""
9585
match = cls._xml_elm_line_patt.match(line)
9686
if match is None:
@@ -105,7 +95,7 @@ def _parse_line(cls, line: str) -> Tuple[str, str, str, str]:
10595
class MetaOxmlElement(type):
10696
"""Metaclass for BaseOxmlElement."""
10797

108-
def __init__(cls, clsname: str, bases: Tuple[type, ...], namespace: Dict[str, Any]):
98+
def __init__(cls, clsname: str, bases: tuple[type, ...], namespace: dict[str, Any]):
10999
dispatchable = (
110100
OneAndOnlyOne,
111101
OneOrMore,
@@ -280,7 +270,7 @@ class _BaseChildElement:
280270
and ZeroOrMore.
281271
"""
282272

283-
def __init__(self, nsptagname: str, successors: Tuple[str, ...] = ()):
273+
def __init__(self, nsptagname: str, successors: tuple[str, ...] = ()):
284274
super(_BaseChildElement, self).__init__()
285275
self._nsptagname = nsptagname
286276
self._successors = successors
@@ -446,7 +436,7 @@ def populate_class_members( # pyright: ignore[reportIncompatibleMethodOverride]
446436
self,
447437
element_cls: MetaOxmlElement,
448438
group_prop_name: str,
449-
successors: Tuple[str, ...],
439+
successors: tuple[str, ...],
450440
) -> None:
451441
"""Add the appropriate methods to `element_cls`."""
452442
self._element_cls = element_cls
@@ -597,7 +587,7 @@ class ZeroOrOneChoice(_BaseChildElement):
597587
"""Correspondes to an ``EG_*`` element group where at most one of its members may
598588
appear as a child."""
599589

600-
def __init__(self, choices: Sequence[Choice], successors: Tuple[str, ...] = ()):
590+
def __init__(self, choices: Sequence[Choice], successors: tuple[str, ...] = ()):
601591
self._choices = choices
602592
self._successors = successors
603593

0 commit comments

Comments
 (0)