Skip to content

Commit 5d230aa

Browse files
authored
change type hints from comment annotations to inline annotations in _memberspec (#455)
1 parent 7b38a7a commit 5d230aa

File tree

1 file changed

+68
-79
lines changed

1 file changed

+68
-79
lines changed

comtypes/_memberspec.py

Lines changed: 68 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
import comtypes
1616

1717

18-
PositionalParamFlagType = Tuple[int, Optional[str]]
19-
OptionalParamFlagType = Tuple[int, Optional[str], Any]
20-
ParamFlagType = _UnionT[PositionalParamFlagType, OptionalParamFlagType]
21-
PositionalArgSpecElmType = Tuple[List[str], Type[_CData], str]
22-
OptionalArgSpecElmType = Tuple[List[str], Type[_CData], str, Any]
23-
ArgSpecElmType = _UnionT[PositionalArgSpecElmType, OptionalArgSpecElmType]
18+
_PositionalParamFlagType = Tuple[int, Optional[str]]
19+
_OptionalParamFlagType = Tuple[int, Optional[str], Any]
20+
_ParamFlagType = _UnionT[_PositionalParamFlagType, _OptionalParamFlagType]
21+
_PositionalArgSpecElmType = Tuple[List[str], Type[_CData], str]
22+
_OptionalArgSpecElmType = Tuple[List[str], Type[_CData], str, Any]
23+
_ArgSpecElmType = _UnionT[_PositionalArgSpecElmType, _OptionalArgSpecElmType]
2424

2525

2626
_PARAMFLAGS = {
@@ -40,13 +40,18 @@ def _encode_idl(names):
4040
_NOTHING = object()
4141

4242

43-
def _unpack_argspec(idl, typ, name=None, defval=_NOTHING):
44-
# type: (List[str], Type[_CData], Optional[str], Any) -> Tuple[List[str], Type[_CData], Optional[str], Any]
43+
def _unpack_argspec(
44+
idl: List[str],
45+
typ: Type[_CData],
46+
name: Optional[str] = None,
47+
defval: Any = _NOTHING,
48+
) -> Tuple[List[str], Type[_CData], Optional[str], Any]:
4549
return idl, typ, name, defval
4650

4751

48-
def _resolve_argspec(items):
49-
# type: (Tuple[ArgSpecElmType, ...]) -> Tuple[Tuple[ParamFlagType, ...], Tuple[Type[_CData], ...]]
52+
def _resolve_argspec(
53+
items: Tuple[_ArgSpecElmType, ...]
54+
) -> Tuple[Tuple[_ParamFlagType, ...], Tuple[Type[_CData], ...]]:
5055
"""Unpacks and converts from argspec to paramflags and argtypes.
5156
5257
- paramflags is a sequence of `(pflags: int, argname: str, | None[, defval: Any])`.
@@ -83,12 +88,11 @@ class _MemberSpec(object):
8388
__slots__ = ("name", "idlflags", "restype")
8489

8590
def __init__(self, name, idlflags, restype):
86-
self.name = name # type: str
87-
self.idlflags = idlflags # type: Tuple[_UnionT[str, int], ...]
88-
self.restype = restype # type: Optional[Type[_CData]]
91+
self.name: str = name
92+
self.idlflags: Tuple[_UnionT[str, int], ...] = idlflags
93+
self.restype: Optional[Type[_CData]] = restype
8994

90-
def is_prop(self):
91-
# type: () -> bool
95+
def is_prop(self) -> bool:
9296
propflags = ("propget", "propput", "propputref")
9397
return any(f in propflags for f in self.idlflags)
9498

@@ -99,9 +103,9 @@ class _ComMemberSpec(_MemberSpec):
99103
__slots__ = ("argtypes", "paramflags", "doc")
100104

101105
def __init__(self, restype, name, argtypes, paramflags, idlflags, doc):
102-
self.argtypes = argtypes # type: Tuple[Type[_CData], ...]
103-
self.paramflags = paramflags # type: Optional[Tuple[ParamFlagType, ...]]
104-
self.doc = doc # type: Optional[str]
106+
self.argtypes: Tuple[Type[_CData], ...] = argtypes
107+
self.paramflags: Optional[Tuple[_ParamFlagType, ...]] = paramflags
108+
self.doc: Optional[str] = doc
105109
super(_ComMemberSpec, self).__init__(name, idlflags, restype)
106110

107111
def __iter__(self):
@@ -125,13 +129,12 @@ class _DispMemberSpec(_MemberSpec):
125129
__slots__ = ("what", "argspec")
126130

127131
def __init__(self, what, name, idlflags, restype, argspec):
128-
self.what = what # type: str
129-
self.argspec = argspec # type: Tuple[ArgSpecElmType, ...]
132+
self.what: str = what
133+
self.argspec: Tuple[_ArgSpecElmType, ...] = argspec
130134
super(_DispMemberSpec, self).__init__(name, idlflags, restype)
131135

132136
@property
133-
def memid(self):
134-
# type: () -> int
137+
def memid(self) -> int:
135138
try:
136139
return [x for x in self.idlflags if isinstance(x, int)][0]
137140
except IndexError:
@@ -145,8 +148,15 @@ def __iter__(self):
145148
yield item
146149

147150

148-
def _fix_inout_args(func, argtypes, paramflags):
149-
# type: (Callable[..., Any], Tuple[Type[_CData], ...], Tuple[ParamFlagType, ...]) -> Callable[..., Any]
151+
_PropFunc = Optional[Callable[..., Any]]
152+
_DocType = Optional[str]
153+
154+
155+
def _fix_inout_args(
156+
func: Callable[..., Any],
157+
argtypes: Tuple[Type[_CData], ...],
158+
paramflags: Tuple[_ParamFlagType, ...],
159+
) -> Callable[..., Any]:
150160
"""This function provides a workaround for a bug in `ctypes`.
151161
152162
[in, out] parameters must be converted with the argtype's `from_param`
@@ -230,24 +240,24 @@ def call_with_inout(self, *args, **kw):
230240

231241
class PropertyMapping(object):
232242
def __init__(self):
233-
self._data = (
234-
{}
235-
) # type: Dict[Tuple[str, Optional[str], int], List[Optional[Callable[..., Any]]]]
243+
self._data: Dict[Tuple[str, _DocType, int], List[_PropFunc]] = {}
236244

237-
def add_propget(self, name, doc, nargs, func):
238-
# type: (str, Optional[str], int, Callable[..., Any]) -> None
245+
def add_propget(
246+
self, name: str, doc: _DocType, nargs: int, func: Callable[..., Any]
247+
) -> None:
239248
self._data.setdefault((name, doc, nargs), [None, None, None])[0] = func
240249

241-
def add_propput(self, name, doc, nargs, func):
242-
# type: (str, Optional[str], int, Callable[..., Any]) -> None
250+
def add_propput(
251+
self, name: str, doc: _DocType, nargs: int, func: Callable[..., Any]
252+
) -> None:
243253
self._data.setdefault((name, doc, nargs), [None, None, None])[1] = func
244254

245-
def add_propputref(self, name, doc, nargs, func):
246-
# type: (str, Optional[str], int, Callable[..., Any]) -> None
255+
def add_propputref(
256+
self, name: str, doc: _DocType, nargs: int, func: Callable[..., Any]
257+
) -> None:
247258
self._data.setdefault((name, doc, nargs), [None, None, None])[2] = func
248259

249-
def __iter__(self):
250-
# type: () -> Iterator[Tuple[str, Optional[str], int, Optional[Callable[..., Any]], Optional[Callable[..., Any]]]]
260+
def __iter__(self) -> Iterator[Tuple[str, _DocType, int, _PropFunc, _PropFunc]]:
251261
for (name, doc, nargs), (fget, propput, propputref) in self._data.items():
252262
if propput is not None and propputref is not None:
253263
# Create a setter method that examines the argument type
@@ -269,13 +279,11 @@ def put_or_putref(self, *args):
269279

270280

271281
class PropertyGenerator(object):
272-
def __init__(self, cls_name):
273-
# type: (str) -> None
282+
def __init__(self, cls_name: str) -> None:
274283
self._mapping = PropertyMapping()
275284
self._cls_name = cls_name
276285

277-
def add(self, m, func):
278-
# type: (_MemberSpec, Callable[..., Any]) -> None
286+
def add(self, m: _MemberSpec, func: Callable[..., Any]) -> None:
279287
"""Adds member spec and func to mapping."""
280288
if "propget" in m.idlflags:
281289
name, doc, nargs = self.to_propget_keys(m)
@@ -291,8 +299,7 @@ def add(self, m, func):
291299

292300
# The following code assumes that the docstrings for
293301
# propget and propput are identical.
294-
def __iter__(self):
295-
# type: () -> Iterator[Tuple[str, _UnionT[property, named_property]]]
302+
def __iter__(self) -> Iterator[Tuple[str, _UnionT[property, "named_property"]]]:
296303
for name, doc, nargs, fget, fset in self._mapping:
297304
if nargs == 0:
298305
prop = property(fget, fset, None, doc)
@@ -303,75 +310,62 @@ def __iter__(self):
303310
prop = named_property("%s.%s" % (self._cls_name, name), fget, fset, doc)
304311
yield (name, prop)
305312

306-
def to_propget_keys(self, m):
307-
# type: (_MemberSpec) -> Tuple[str, Optional[str], int]
313+
def to_propget_keys(self, m: _MemberSpec) -> Tuple[str, _DocType, int]:
308314
raise NotImplementedError
309315

310-
def to_propput_keys(self, m):
311-
# type: (_MemberSpec) -> Tuple[str, Optional[str], int]
316+
def to_propput_keys(self, m: _MemberSpec) -> Tuple[str, _DocType, int]:
312317
raise NotImplementedError
313318

314-
def to_propputref_keys(self, m):
315-
# type: (_MemberSpec) -> Tuple[str, Optional[str], int]
319+
def to_propputref_keys(self, m: _MemberSpec) -> Tuple[str, _DocType, int]:
316320
raise NotImplementedError
317321

318322

319323
class ComPropertyGenerator(PropertyGenerator):
320324
# XXX Hm. What, when paramflags is None?
321325
# Or does have '0' values?
322326
# Seems we loose then, at least for properties...
323-
def to_propget_keys(self, m):
324-
# type: (_ComMemberSpec) -> Tuple[str, Optional[str], int]
327+
def to_propget_keys(self, m: _ComMemberSpec) -> Tuple[str, _DocType, int]:
325328
assert m.name.startswith("_get_")
326329
assert m.paramflags is not None
327330
nargs = len([f for f in m.paramflags if f[0] & 7 in (0, 1)])
328331
# XXX or should we do this?
329332
# nargs = len([f for f in paramflags if (f[0] & 1) or (f[0] == 0)])
330333
return m.name[len("_get_") :], m.doc, nargs
331334

332-
def to_propput_keys(self, m):
333-
# type: (_ComMemberSpec) -> Tuple[str, Optional[str], int]
335+
def to_propput_keys(self, m: _ComMemberSpec) -> Tuple[str, _DocType, int]:
334336
assert m.name.startswith("_set_")
335337
assert m.paramflags is not None
336338
nargs = len([f for f in m.paramflags if f[0] & 7 in (0, 1)]) - 1
337339
return m.name[len("_set_") :], m.doc, nargs
338340

339-
def to_propputref_keys(self, m):
340-
# type: (_ComMemberSpec) -> Tuple[str, Optional[str], int]
341+
def to_propputref_keys(self, m: _ComMemberSpec) -> Tuple[str, _DocType, int]:
341342
assert m.name.startswith("_setref_")
342343
assert m.paramflags is not None
343344
nargs = len([f for f in m.paramflags if f[0] & 7 in (0, 1)]) - 1
344345
return m.name[len("_setref_") :], m.doc, nargs
345346

346347

347348
class DispPropertyGenerator(PropertyGenerator):
348-
def to_propget_keys(self, m):
349-
# type: (_DispMemberSpec) -> Tuple[str, Optional[str], int]
349+
def to_propget_keys(self, m: _DispMemberSpec) -> Tuple[str, _DocType, int]:
350350
return m.name, None, len(m.argspec)
351351

352-
def to_propput_keys(self, m):
353-
# type: (_DispMemberSpec) -> Tuple[str, Optional[str], int]
352+
def to_propput_keys(self, m: _DispMemberSpec) -> Tuple[str, _DocType, int]:
354353
return m.name, None, len(m.argspec) - 1
355354

356-
def to_propputref_keys(self, m):
357-
# type: (_DispMemberSpec) -> Tuple[str, Optional[str], int]
355+
def to_propputref_keys(self, m: _DispMemberSpec) -> Tuple[str, _DocType, int]:
358356
return m.name, None, len(m.argspec) - 1
359357

360358

361359
class ComMemberGenerator(object):
362-
def __init__(self, cls_name, vtbl_offset, iid):
363-
# type: (str, int, comtypes.GUID) -> None
360+
def __init__(self, cls_name: str, vtbl_offset: int, iid: comtypes.GUID) -> None:
364361
self._vtbl_offset = vtbl_offset
365362
self._iid = iid
366363
self._props = ComPropertyGenerator(cls_name)
367364
# sequence of (name: str, func: Callable, raw_func: Callable, is_prop: bool)
368-
self._mths = (
369-
[]
370-
) # type: List[Tuple[str, Callable[..., Any], Callable[..., Any], bool]]
365+
self._mths: List[Tuple[str, Callable[..., Any], Callable[..., Any], bool]] = []
371366
self._member_index = 0
372367

373-
def add(self, m):
374-
# type: (_ComMemberSpec) -> None
368+
def add(self, m: _ComMemberSpec) -> None:
375369
proto = ctypes.WINFUNCTYPE(m.restype, *m.argtypes)
376370
# a low level unbound method calling the com method.
377371
# attach it with a private name (__com_AddRef, for example),
@@ -390,8 +384,9 @@ def add(self, m):
390384
self._mths.append((m.name, func, raw_func, is_prop))
391385
self._member_index += 1
392386

393-
def _fix_args(self, m, func):
394-
# type: (_ComMemberSpec, Callable[..., Any]) -> Callable[..., Any]
387+
def _fix_args(
388+
self, m: _ComMemberSpec, func: Callable[..., Any]
389+
) -> Callable[..., Any]:
395390
"""This is a workaround. See `_fix_inout_args` docstring and comments."""
396391
if m.paramflags:
397392
dirflags = [(p[0] & 3) for p in m.paramflags]
@@ -407,16 +402,12 @@ def properties(self):
407402

408403

409404
class DispMemberGenerator(object):
410-
def __init__(self, cls_name):
411-
# type: (str) -> None
405+
def __init__(self, cls_name: str) -> None:
412406
self._props = DispPropertyGenerator(cls_name)
413407
# sequence of (name: str, func_or_prop: Callable | property, is_prop: bool)
414-
self._items = (
415-
[]
416-
) # type: List[Tuple[str, _UnionT[Callable[..., Any], property], bool]]
408+
self._items: List[Tuple[str, _UnionT[Callable[..., Any], property], bool]] = []
417409

418-
def add(self, m):
419-
# type: (_DispMemberSpec) -> None
410+
def add(self, m: _DispMemberSpec) -> None:
420411
if m.what == "DISPPROPERTY": # DISPPROPERTY
421412
assert not m.argspec # XXX does not yet work for properties with parameters
422413
is_prop = True
@@ -431,8 +422,7 @@ def add(self, m):
431422
else:
432423
self._items.append((m.name, func, is_prop))
433424

434-
def _make_disp_property(self, m):
435-
# type: (_DispMemberSpec) -> property
425+
def _make_disp_property(self, m: _DispMemberSpec) -> property:
436426
# XXX doc string missing in property
437427
memid = m.memid
438428

@@ -451,8 +441,7 @@ def fset(obj, value):
451441
return property(fget, fset)
452442

453443
# Should the funcs/mths we create have restype and/or argtypes attributes?
454-
def _make_disp_method(self, m):
455-
# type: (_DispMemberSpec) -> Callable[..., Any]
444+
def _make_disp_method(self, m: _DispMemberSpec) -> Callable[..., Any]:
456445
memid = m.memid
457446
if "propget" in m.idlflags:
458447

0 commit comments

Comments
 (0)