@@ -12,12 +12,12 @@ __all__ = ["Message", "EmailMessage"]
1212
1313_T = TypeVar ("_T" )
1414# Type returned by Policy.header_fetch_parse, often str or Header.
15- _HeaderT = TypeVar ("_HeaderT" , default = str )
16- _HeaderParamT = TypeVar ("_HeaderParamT" , default = str )
15+ _HeaderT_co = TypeVar ("_HeaderT_co" , covariant = True , default = str )
16+ _HeaderParamT_contra = TypeVar ("_HeaderParamT_contra" , contravariant = True , default = str )
1717# Represents headers constructed by HeaderRegistry. Those are sub-classes
1818# of BaseHeader and another header type.
19- _HeaderRegistryT = TypeVar ("_HeaderRegistryT" , default = Any )
20- _HeaderRegistryParamT = TypeVar ("_HeaderRegistryParamT" , default = Any )
19+ _HeaderRegistryT_co = TypeVar ("_HeaderRegistryT_co" , covariant = True , default = Any )
20+ _HeaderRegistryParamT_contra = TypeVar ("_HeaderRegistryParamT_contra" , contravariant = True , default = Any )
2121
2222_PayloadType : TypeAlias = Message | str
2323_EncodedPayloadType : TypeAlias = Message | bytes
@@ -30,7 +30,7 @@ class _SupportsEncodeToPayload(Protocol):
3030class _SupportsDecodeToPayload (Protocol ):
3131 def decode (self , encoding : str , errors : str , / ) -> _PayloadType | _MultipartPayloadType : ...
3232
33- class Message (Generic [_HeaderT , _HeaderParamT ]):
33+ class Message (Generic [_HeaderT_co , _HeaderParamT_contra ]):
3434 # The policy attributes and arguments in this class and its subclasses
3535 # would ideally use Policy[Self], but this is not possible.
3636 policy : Policy [Any ] # undocumented
@@ -76,22 +76,22 @@ class Message(Generic[_HeaderT, _HeaderParamT]):
7676 # This is important for protocols using __getitem__, like SupportsKeysAndGetItem
7777 # Morally, the return type should be `AnyOf[_HeaderType, None]`,
7878 # so using "the Any trick" instead.
79- def __getitem__ (self , name : str ) -> _HeaderT | MaybeNone : ...
80- def __setitem__ (self , name : str , val : _HeaderParamT ) -> None : ...
79+ def __getitem__ (self , name : str ) -> _HeaderT_co | MaybeNone : ...
80+ def __setitem__ (self , name : str , val : _HeaderParamT_contra ) -> None : ...
8181 def __delitem__ (self , name : str ) -> None : ...
8282 def keys (self ) -> list [str ]: ...
83- def values (self ) -> list [_HeaderT ]: ...
84- def items (self ) -> list [tuple [str , _HeaderT ]]: ...
83+ def values (self ) -> list [_HeaderT_co ]: ...
84+ def items (self ) -> list [tuple [str , _HeaderT_co ]]: ...
8585 @overload
86- def get (self , name : str , failobj : None = None ) -> _HeaderT | None : ...
86+ def get (self , name : str , failobj : None = None ) -> _HeaderT_co | None : ...
8787 @overload
88- def get (self , name : str , failobj : _T ) -> _HeaderT | _T : ...
88+ def get (self , name : str , failobj : _T ) -> _HeaderT_co | _T : ...
8989 @overload
90- def get_all (self , name : str , failobj : None = None ) -> list [_HeaderT ] | None : ...
90+ def get_all (self , name : str , failobj : None = None ) -> list [_HeaderT_co ] | None : ...
9191 @overload
92- def get_all (self , name : str , failobj : _T ) -> list [_HeaderT ] | _T : ...
92+ def get_all (self , name : str , failobj : _T ) -> list [_HeaderT_co ] | _T : ...
9393 def add_header (self , _name : str , _value : str , ** _params : _ParamsType ) -> None : ...
94- def replace_header (self , _name : str , _value : _HeaderParamT ) -> None : ...
94+ def replace_header (self , _name : str , _value : _HeaderParamT_contra ) -> None : ...
9595 def get_content_type (self ) -> str : ...
9696 def get_content_maintype (self ) -> str : ...
9797 def get_content_subtype (self ) -> str : ...
@@ -144,18 +144,18 @@ class Message(Generic[_HeaderT, _HeaderParamT]):
144144 replace : bool = False ,
145145 ) -> None : ...
146146 # The following two methods are undocumented, but a source code comment states that they are public API
147- def set_raw (self , name : str , value : _HeaderParamT ) -> None : ...
148- def raw_items (self ) -> Iterator [tuple [str , _HeaderT ]]: ...
147+ def set_raw (self , name : str , value : _HeaderParamT_contra ) -> None : ...
148+ def raw_items (self ) -> Iterator [tuple [str , _HeaderT_co ]]: ...
149149
150- class MIMEPart (Message [_HeaderRegistryT , _HeaderRegistryParamT ]):
150+ class MIMEPart (Message [_HeaderRegistryT_co , _HeaderRegistryParamT_contra ]):
151151 def __init__ (self , policy : Policy [Any ] | None = None ) -> None : ...
152- def get_body (self , preferencelist : Sequence [str ] = ("related" , "html" , "plain" )) -> MIMEPart [_HeaderRegistryT ] | None : ...
152+ def get_body (self , preferencelist : Sequence [str ] = ("related" , "html" , "plain" )) -> MIMEPart [_HeaderRegistryT_co ] | None : ...
153153 def attach (self , payload : Self ) -> None : ... # type: ignore[override]
154154 # The attachments are created via type(self) in the attach method. It's theoretically
155155 # possible to sneak other attachment types into a MIMEPart instance, but could cause
156156 # cause unforseen consequences.
157157 def iter_attachments (self ) -> Iterator [Self ]: ...
158- def iter_parts (self ) -> Iterator [MIMEPart [_HeaderRegistryT ]]: ...
158+ def iter_parts (self ) -> Iterator [MIMEPart [_HeaderRegistryT_co ]]: ...
159159 def get_content (self , * args : Any , content_manager : ContentManager | None = None , ** kw : Any ) -> Any : ...
160160 def set_content (self , * args : Any , content_manager : ContentManager | None = None , ** kw : Any ) -> None : ...
161161 def make_related (self , boundary : str | None = None ) -> None : ...
0 commit comments