60
60
61
61
from __future__ import annotations
62
62
63
- import copy as std_copy
64
- from collections .abc import Callable , Generator , Iterable , Mapping , Sequence
63
+ from collections .abc import Callable , Generator , Iterable , Iterator , Mapping , Sequence
65
64
from operator import attrgetter
66
- from typing import Any , cast
65
+ from typing import Any , TypeAlias , TypeVar , cast
67
66
68
67
from .types import UNDEFINED , Distinct , Error , Sentinel
69
68
69
+ _T = TypeVar ("_T" )
70
70
71
- def make_lambda (expr : str , params : str = 'item' , context : dict [str , Any ] | None = None ):
71
+ def make_lambda (expr : str , params : str = 'item' , context : dict [str , Any ] | None = None ) -> Callable [..., Any ] :
72
72
"""Makes lambda function from expression.
73
73
74
74
Arguments:
@@ -87,13 +87,13 @@ def make_lambda(expr: str, params: str='item', context: dict[str, Any] | None=No
87
87
#: Collection Item
88
88
Item = Any
89
89
#: Collection Item type specification
90
- TypeSpec = type | tuple [type ]
90
+ TypeSpec : TypeAlias = type | tuple [type , ... ]
91
91
#: Collection Item sort expression
92
- ItemExpr = str | Callable [[Item ], Item ]
92
+ ItemExpr : TypeAlias = str | Callable [[Item ], Any ]
93
93
#: Filter expression
94
- FilterExpr = str | Callable [[Item ], bool ]
94
+ FilterExpr : TypeAlias = str | Callable [[Item ], bool ]
95
95
#: Check expression
96
- CheckExpr = str | Callable [[Item , Any ], bool ]
96
+ CheckExpr : TypeAlias = str | Callable [[Item , Any ], bool ]
97
97
98
98
class BaseObjectCollection :
99
99
"""Base class for collection of objects.
@@ -128,7 +128,7 @@ def filterfalse(self, expr: FilterExpr) -> Generator[Item, None, None]:
128
128
"""
129
129
fce = expr if callable (expr ) else make_lambda (expr )
130
130
return (item for item in self if not fce (item ))
131
- def find (self , expr : FilterExpr , default : Any = None ) -> Item :
131
+ def find (self , expr : FilterExpr , default : _T = None ) -> Item | _T :
132
132
"""Returns first item for which `expr` is evaluated as True, or default.
133
133
134
134
Arguments:
@@ -291,7 +291,7 @@ def __valchk(self, value: Item) -> None:
291
291
def __updchk (self ) -> None :
292
292
if self .__frozen :
293
293
raise TypeError ("Cannot modify frozen DataList" )
294
- def __setitem__ (self , index , value ) -> None :
294
+ def __setitem__ (self , index : int | slice , value : Item | Iterable [ Item ] ) -> None :
295
295
"""Set item[index] = value. Performs type check and frozen check."""
296
296
self .__updchk ()
297
297
if isinstance (index , slice ):
@@ -300,11 +300,11 @@ def __setitem__(self, index, value) -> None:
300
300
else :
301
301
self .__valchk (value )
302
302
super ().__setitem__ (index , value )
303
- def __delitem__ (self , index ) -> None :
303
+ def __delitem__ (self , index : int | slice ) -> None :
304
304
"""Delete item[index]. Performs frozen check."""
305
305
self .__updchk ()
306
306
super ().__delitem__ (index )
307
- def __contains__ (self , o ):
307
+ def __contains__ (self , o ) -> bool :
308
308
"""Return key in self. Optimized for frozen lists with a key_expr.
309
309
310
310
If the list is frozen and has a key_expr, uses an internal map for
@@ -345,7 +345,7 @@ def append(self, item: Item) -> None:
345
345
self .__updchk ()
346
346
self .__valchk (item )
347
347
super ().append (item )
348
- def extend (self , iterable : Iterable ) -> None :
348
+ def extend (self , iterable : Iterable [ Item ] ) -> None :
349
349
"""Extend the list by appending all the items in the given iterable.
350
350
351
351
Raises:
@@ -354,7 +354,8 @@ def extend(self, iterable: Iterable) -> None:
354
354
"""
355
355
for item in iterable :
356
356
self .append (item )
357
- def sort (self , attrs : list | None = None , expr : ItemExpr | None = None , * , reverse : bool = False ) -> None :
357
+ def sort (self , attrs : list [str ] | tuple [str , ...] | None = None ,
358
+ expr : ItemExpr | None = None , * , reverse : bool = False ) -> None :
358
359
"""Sort items in-place, optionaly using attribute values as key or key expression.
359
360
360
361
Arguments:
@@ -453,7 +454,7 @@ def extract(self, expr: FilterExpr, *, copy: bool=False) -> DataList:
453
454
else :
454
455
i += 1
455
456
return l
456
- def get (self , key : Any , default : Any = None ) -> Item :
457
+ def get (self , key : Any , default : _T = None ) -> Item | _T :
457
458
"""Returns item with given key using default key expression. Returns `default`
458
459
value if item is not found.
459
460
@@ -489,7 +490,7 @@ def frozen(self) -> bool:
489
490
"""
490
491
return self .__frozen
491
492
@property
492
- def key_expr (self ) -> Item :
493
+ def key_expr (self ) -> Item | None :
493
494
"""Key expression.
494
495
"""
495
496
return self .__key_expr
@@ -533,25 +534,25 @@ class Registry(BaseObjectCollection, Mapping[Any, Distinct]):
533
534
data: Either a `.Distinct` instance, or sequence or mapping of `.Distinct`
534
535
instances.
535
536
"""
536
- def __init__ (self , data : Mapping | Sequence | Registry = None ):
537
- self ._reg : dict = {}
537
+ def __init__ (self , data : Mapping [ Any , Distinct ] | Sequence [ Distinct ] | Registry = None ):
538
+ self ._reg : dict [ Any , Distinct ] = {}
538
539
if data :
539
540
self .update (data )
540
541
def __len__ (self ):
541
542
return len (self ._reg )
542
- def __getitem__ (self , key ) :
543
+ def __getitem__ (self , key : Any ) -> Distinct :
543
544
"""Return self[key]. Accepts a key value or a `.Distinct` instance."""
544
545
return self ._reg [key .get_key () if isinstance (key , Distinct ) else key ]
545
- def __setitem__ (self , key , value ) :
546
+ def __setitem__ (self , key : Any , value : Distinct ) -> None :
546
547
assert isinstance (value , Distinct ) # noqa: S101
547
548
self ._reg [key .get_key () if isinstance (key , Distinct ) else key ] = value
548
- def __delitem__ (self , key ) :
549
+ def __delitem__ (self , key : Any ) -> None :
549
550
del self ._reg [key .get_key () if isinstance (key , Distinct ) else key ]
550
- def __iter__ (self ):
551
+ def __iter__ (self ) -> Iterator [ Distinct ] :
551
552
return iter (self ._reg .values ())
552
- def __repr__ (self ):
553
+ def __repr__ (self ) -> str :
553
554
return f"{ self .__class__ .__name__ } ([{ ', ' .join (repr (x ) for x in self )} ])"
554
- def __contains__ (self , item ) :
555
+ def __contains__ (self , item : Any ) -> bool :
555
556
"""Return key in self. Accepts a key value or a `.Distinct` instance."""
556
557
if isinstance (item , Distinct ):
557
558
item = item .get_key ()
@@ -560,7 +561,7 @@ def clear(self) -> None:
560
561
"""Remove all items from registry.
561
562
"""
562
563
self ._reg .clear ()
563
- def get (self , key : Any , default : Any = None ) -> Distinct :
564
+ def get (self , key : Any , default : _T = None ) -> Distinct | _T :
564
565
""" D.get(key[,d]) -> D[key] if key in D else d. d defaults to None.
565
566
566
567
Arguments:
@@ -580,11 +581,11 @@ def store(self, item: Distinct) -> Distinct:
580
581
raise ValueError (f"Item already registered, key: '{ key } '" )
581
582
self ._reg [key ] = item
582
583
return item
583
- def remove (self , item : Distinct ):
584
+ def remove (self , item : Distinct ) -> None :
584
585
"""Removes item from registry (same as: del R[item]).
585
586
"""
586
587
del self ._reg [item .get_key ()]
587
- def update (self , _from : Distinct | Mapping | Sequence ) -> None :
588
+ def update (self , _from : Distinct | Mapping [ Any , Distinct ] | Sequence [ Distinct ] ) -> None :
588
589
"""Update items in the registry.
589
590
590
591
Arguments:
@@ -596,7 +597,7 @@ def update(self, _from: Distinct | Mapping | Sequence) -> None:
596
597
else :
597
598
for item in cast (Mapping , _from ).values () if hasattr (_from , 'values' ) else _from :
598
599
self [item ] = item
599
- def extend (self , _from : Distinct | Mapping | Sequence ) -> None :
600
+ def extend (self , _from : Distinct | Mapping [ Any , Distinct ] | Sequence [ Distinct ] ) -> None :
600
601
"""Store one or more items to the registry.
601
602
602
603
Unlike `update`, this method requires that the items (or their keys)
@@ -617,17 +618,8 @@ def extend(self, _from: Distinct | Mapping | Sequence) -> None:
617
618
def copy (self ) -> Registry :
618
619
"""Shalow copy of the registry.
619
620
"""
620
- if self .__class__ is Registry :
621
- return Registry (self )
622
- data = self ._reg
623
- try :
624
- self ._reg = {}
625
- c = std_copy .copy (self )
626
- finally :
627
- self ._reg = data
628
- c .update (self )
629
- return c
630
- def pop (self , key : Any , default : Any = ...) -> Distinct :
621
+ return self .__class__ (self )
622
+ def pop (self , key : Any , default : _T = ...) -> Distinct | _T :
631
623
"""Remove specified `key` and return the corresponding `.Distinct` object.
632
624
633
625
If `key` is not found, the `default` is returned if given, otherwise
@@ -653,4 +645,4 @@ def popitem(self, *, last: bool=True) -> Distinct:
653
645
self .remove (item )
654
646
return item
655
647
except StopIteration :
656
- raise KeyError ()
648
+ raise KeyError () # noqa: B904
0 commit comments