15
15
import comtypes
16
16
17
17
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 ]
24
24
25
25
26
26
_PARAMFLAGS = {
@@ -40,13 +40,18 @@ def _encode_idl(names):
40
40
_NOTHING = object ()
41
41
42
42
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 ]:
45
49
return idl , typ , name , defval
46
50
47
51
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 ], ...]]:
50
55
"""Unpacks and converts from argspec to paramflags and argtypes.
51
56
52
57
- paramflags is a sequence of `(pflags: int, argname: str, | None[, defval: Any])`.
@@ -83,12 +88,11 @@ class _MemberSpec(object):
83
88
__slots__ = ("name" , "idlflags" , "restype" )
84
89
85
90
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
89
94
90
- def is_prop (self ):
91
- # type: () -> bool
95
+ def is_prop (self ) -> bool :
92
96
propflags = ("propget" , "propput" , "propputref" )
93
97
return any (f in propflags for f in self .idlflags )
94
98
@@ -99,9 +103,9 @@ class _ComMemberSpec(_MemberSpec):
99
103
__slots__ = ("argtypes" , "paramflags" , "doc" )
100
104
101
105
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
105
109
super (_ComMemberSpec , self ).__init__ (name , idlflags , restype )
106
110
107
111
def __iter__ (self ):
@@ -125,13 +129,12 @@ class _DispMemberSpec(_MemberSpec):
125
129
__slots__ = ("what" , "argspec" )
126
130
127
131
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
130
134
super (_DispMemberSpec , self ).__init__ (name , idlflags , restype )
131
135
132
136
@property
133
- def memid (self ):
134
- # type: () -> int
137
+ def memid (self ) -> int :
135
138
try :
136
139
return [x for x in self .idlflags if isinstance (x , int )][0 ]
137
140
except IndexError :
@@ -145,8 +148,15 @@ def __iter__(self):
145
148
yield item
146
149
147
150
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 ]:
150
160
"""This function provides a workaround for a bug in `ctypes`.
151
161
152
162
[in, out] parameters must be converted with the argtype's `from_param`
@@ -230,24 +240,24 @@ def call_with_inout(self, *args, **kw):
230
240
231
241
class PropertyMapping (object ):
232
242
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 ]] = {}
236
244
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 :
239
248
self ._data .setdefault ((name , doc , nargs ), [None , None , None ])[0 ] = func
240
249
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 :
243
253
self ._data .setdefault ((name , doc , nargs ), [None , None , None ])[1 ] = func
244
254
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 :
247
258
self ._data .setdefault ((name , doc , nargs ), [None , None , None ])[2 ] = func
248
259
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 ]]:
251
261
for (name , doc , nargs ), (fget , propput , propputref ) in self ._data .items ():
252
262
if propput is not None and propputref is not None :
253
263
# Create a setter method that examines the argument type
@@ -269,13 +279,11 @@ def put_or_putref(self, *args):
269
279
270
280
271
281
class PropertyGenerator (object ):
272
- def __init__ (self , cls_name ):
273
- # type: (str) -> None
282
+ def __init__ (self , cls_name : str ) -> None :
274
283
self ._mapping = PropertyMapping ()
275
284
self ._cls_name = cls_name
276
285
277
- def add (self , m , func ):
278
- # type: (_MemberSpec, Callable[..., Any]) -> None
286
+ def add (self , m : _MemberSpec , func : Callable [..., Any ]) -> None :
279
287
"""Adds member spec and func to mapping."""
280
288
if "propget" in m .idlflags :
281
289
name , doc , nargs = self .to_propget_keys (m )
@@ -291,8 +299,7 @@ def add(self, m, func):
291
299
292
300
# The following code assumes that the docstrings for
293
301
# 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" ]]]:
296
303
for name , doc , nargs , fget , fset in self ._mapping :
297
304
if nargs == 0 :
298
305
prop = property (fget , fset , None , doc )
@@ -303,75 +310,62 @@ def __iter__(self):
303
310
prop = named_property ("%s.%s" % (self ._cls_name , name ), fget , fset , doc )
304
311
yield (name , prop )
305
312
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 ]:
308
314
raise NotImplementedError
309
315
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 ]:
312
317
raise NotImplementedError
313
318
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 ]:
316
320
raise NotImplementedError
317
321
318
322
319
323
class ComPropertyGenerator (PropertyGenerator ):
320
324
# XXX Hm. What, when paramflags is None?
321
325
# Or does have '0' values?
322
326
# 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 ]:
325
328
assert m .name .startswith ("_get_" )
326
329
assert m .paramflags is not None
327
330
nargs = len ([f for f in m .paramflags if f [0 ] & 7 in (0 , 1 )])
328
331
# XXX or should we do this?
329
332
# nargs = len([f for f in paramflags if (f[0] & 1) or (f[0] == 0)])
330
333
return m .name [len ("_get_" ) :], m .doc , nargs
331
334
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 ]:
334
336
assert m .name .startswith ("_set_" )
335
337
assert m .paramflags is not None
336
338
nargs = len ([f for f in m .paramflags if f [0 ] & 7 in (0 , 1 )]) - 1
337
339
return m .name [len ("_set_" ) :], m .doc , nargs
338
340
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 ]:
341
342
assert m .name .startswith ("_setref_" )
342
343
assert m .paramflags is not None
343
344
nargs = len ([f for f in m .paramflags if f [0 ] & 7 in (0 , 1 )]) - 1
344
345
return m .name [len ("_setref_" ) :], m .doc , nargs
345
346
346
347
347
348
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 ]:
350
350
return m .name , None , len (m .argspec )
351
351
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 ]:
354
353
return m .name , None , len (m .argspec ) - 1
355
354
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 ]:
358
356
return m .name , None , len (m .argspec ) - 1
359
357
360
358
361
359
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 :
364
361
self ._vtbl_offset = vtbl_offset
365
362
self ._iid = iid
366
363
self ._props = ComPropertyGenerator (cls_name )
367
364
# 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 ]] = []
371
366
self ._member_index = 0
372
367
373
- def add (self , m ):
374
- # type: (_ComMemberSpec) -> None
368
+ def add (self , m : _ComMemberSpec ) -> None :
375
369
proto = ctypes .WINFUNCTYPE (m .restype , * m .argtypes )
376
370
# a low level unbound method calling the com method.
377
371
# attach it with a private name (__com_AddRef, for example),
@@ -390,8 +384,9 @@ def add(self, m):
390
384
self ._mths .append ((m .name , func , raw_func , is_prop ))
391
385
self ._member_index += 1
392
386
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 ]:
395
390
"""This is a workaround. See `_fix_inout_args` docstring and comments."""
396
391
if m .paramflags :
397
392
dirflags = [(p [0 ] & 3 ) for p in m .paramflags ]
@@ -407,16 +402,12 @@ def properties(self):
407
402
408
403
409
404
class DispMemberGenerator (object ):
410
- def __init__ (self , cls_name ):
411
- # type: (str) -> None
405
+ def __init__ (self , cls_name : str ) -> None :
412
406
self ._props = DispPropertyGenerator (cls_name )
413
407
# 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 ]] = []
417
409
418
- def add (self , m ):
419
- # type: (_DispMemberSpec) -> None
410
+ def add (self , m : _DispMemberSpec ) -> None :
420
411
if m .what == "DISPPROPERTY" : # DISPPROPERTY
421
412
assert not m .argspec # XXX does not yet work for properties with parameters
422
413
is_prop = True
@@ -431,8 +422,7 @@ def add(self, m):
431
422
else :
432
423
self ._items .append ((m .name , func , is_prop ))
433
424
434
- def _make_disp_property (self , m ):
435
- # type: (_DispMemberSpec) -> property
425
+ def _make_disp_property (self , m : _DispMemberSpec ) -> property :
436
426
# XXX doc string missing in property
437
427
memid = m .memid
438
428
@@ -451,8 +441,7 @@ def fset(obj, value):
451
441
return property (fget , fset )
452
442
453
443
# 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 ]:
456
445
memid = m .memid
457
446
if "propget" in m .idlflags :
458
447
0 commit comments