@@ -3,7 +3,6 @@ from collections.abc import (
33 Callable ,
44 Iterable ,
55 Iterator ,
6- Mapping ,
76)
87from typing import (
98 Any ,
@@ -1058,44 +1057,63 @@ class _Attrib:
10581057# from _Element, even though their interfaces are vastly different
10591058# from _Element. The notion of or'ing different kind of elements
10601059# throughout all element methods would cause great inconvenience
1061- # for me and all users alike -- using some _AnyHtmlElement alias
1062- # to represent union of all elements was a failure for users.
1060+ # for maintenance and usage.
10631061# We opt for convenience and ease of use in the future.
1062+ #
1063+ # TODO (low priority) The list of methods that don't work for content-only
1064+ # elements could be incomplete
10641065class __ContentOnlyElement (_Element ):
10651066 #
1066- # Useful properties
1067- # .text and .tag are overridden in each concrete class below
1067+ # - .text and .tag are overridden in each concrete subclass
1068+ # - attrib() returns some sort of immutable empty-dict-like
1069+ # object. Don't intend to waste time and effort on it.
1070+ # - __getitem__() source code returns empty list upon slice
1071+ # input, stub bans whole method altogether
10681072 #
1073+ @deprecated ("Some properties of content-only elements are fake values" )
10691074 @property
1070- # pyrefly: ignore[bad-override]
1071- def attrib ( self ) -> Mapping [ _t . Unused , _t . Unused ]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
1075+ def attrib ( self ) -> _Attrib : ...
1076+ @ deprecated ( "Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10721077 # pyrefly: ignore[bad-override]
10731078 def get (self , key : _t .Unused , default : _t .Unused = None ) -> None : ... # type: ignore[override]
1079+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
1080+ def __len__ (self ) -> Literal [0 ]: ...
1081+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10741082 # pyrefly: ignore[bad-override]
10751083 def set (self , key : Never , value : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1084+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10761085 # pyrefly: ignore[bad-override]
10771086 def append (self , element : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1087+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10781088 # pyrefly: ignore[bad-override]
10791089 def insert (self , index : Never , value : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1090+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10801091 # pyrefly: ignore[bad-override]
10811092 def __setitem__ (self , __k : Never , __v : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1082- # The intention is to discourage elem.__getitem__, allowing slice
1083- # argument in runtime doesn't make any sense
1093+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10841094 # pyrefly: ignore[bad-override]
10851095 def __getitem__ (self , __k : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1096+ #
10861097 # Methods above are explicitly defined in source, while those below aren't
1098+ #
1099+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
10871100 # pyrefly: ignore[bad-override]
1088- def __delitem__ (self , __k : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1089- def __iter__ (self ) -> Never : ...
1090-
1091- # TODO (low priority) There are many, many more methods that
1092- # don't work for content only elements, such as most
1093- # ElementTree / ElementPath ones, and all inherited
1094- # HTML element methods. None of those are handled in
1095- # source code -- users are left to bump into wall themselves.
1096- # For example, append(elem) explicitly raises exception, yet
1097- # one can use extend([elem]) to circumvent restriction.
1098- # Go figure.
1101+ def extend (self , elements : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1102+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
1103+ # pyrefly: ignore[bad-override]
1104+ def remove (self , element : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1105+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
1106+ # pyrefly: ignore[bad-override]
1107+ def index (self , child : Never , start : Never , stop : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1108+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
1109+ def keys (self ) -> list [_t .Unused ]: ...
1110+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
1111+ def values (self ) -> list [_t .Unused ]: ...
1112+ @deprecated ("Most accessor methods of content-only elements are dummies or cause undesirable effect" )
1113+ def items (self ) -> list [_t .Unused ]: ...
1114+ @deprecated ("cssselect method not usable on content-only elements" )
1115+ # pyrefly: ignore[bad-override]
1116+ def cssselect (self , expr : Never ) -> Never : ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
10991117
11001118class _Comment (__ContentOnlyElement ):
11011119 @property # type: ignore[misc]
@@ -1126,7 +1144,8 @@ class _ProcessingInstruction(__ContentOnlyElement):
11261144 @target .setter
11271145 def target (self , value : _t ._TextArg ) -> None : ...
11281146 @property
1129- def attrib (self ) -> dict [str , str ]: ... # type: ignore[override]
1147+ # pyrefly: ignore[bad-override]
1148+ def attrib (self ) -> dict [str , str ]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
11301149
11311150class _Entity (__ContentOnlyElement ):
11321151 @property # type: ignore[misc]
0 commit comments