11import sys
2+ from _typeshed import Incomplete
23from collections .abc import Iterable , Mapping , Sequence
34from types import GenericAlias
45from typing import Any , AnyStr , Final , Generic , Literal , NamedTuple , Protocol , TypeAlias , overload , type_check_only
@@ -63,24 +64,52 @@ class _NetlocResultMixinStr(_NetlocResultMixinBase[str], _ResultMixinStr):
6364class _NetlocResultMixinBytes (_NetlocResultMixinBase [bytes ], _ResultMixinBytes ):
6465 __slots__ = ()
6566
66- class _DefragResultBase (NamedTuple , Generic [AnyStr ]):
67- url : AnyStr
68- fragment : AnyStr
69-
70- class _SplitResultBase (NamedTuple , Generic [AnyStr ]):
71- scheme : AnyStr
72- netloc : AnyStr
73- path : AnyStr
74- query : AnyStr
75- fragment : AnyStr
76-
77- class _ParseResultBase (NamedTuple , Generic [AnyStr ]):
78- scheme : AnyStr
79- netloc : AnyStr
80- path : AnyStr
81- params : AnyStr
82- query : AnyStr
83- fragment : AnyStr
67+ if sys .version_info >= (3 , 15 ):
68+ class _DefragResultBase (NamedTuple , Generic [AnyStr ]):
69+ url : AnyStr
70+ fragment : AnyStr
71+ def geturl (self ) -> AnyStr : ... # type: ignore[misc]
72+
73+ else :
74+ class _DefragResultBase (NamedTuple , Generic [AnyStr ]):
75+ url : AnyStr
76+ fragment : AnyStr
77+
78+ if sys .version_info >= (3 , 15 ):
79+ class _SplitResultBase (NamedTuple , Generic [AnyStr ]):
80+ scheme : AnyStr
81+ netloc : AnyStr
82+ path : AnyStr
83+ query : AnyStr
84+ fragment : AnyStr
85+ def geturl (self ) -> AnyStr : ... # type: ignore[misc]
86+
87+ else :
88+ class _SplitResultBase (NamedTuple , Generic [AnyStr ]):
89+ scheme : AnyStr
90+ netloc : AnyStr
91+ path : AnyStr
92+ query : AnyStr
93+ fragment : AnyStr
94+
95+ if sys .version_info >= (3 , 15 ):
96+ class _ParseResultBase (NamedTuple , Generic [AnyStr ]):
97+ scheme : AnyStr
98+ netloc : AnyStr
99+ path : AnyStr
100+ params : AnyStr
101+ query : AnyStr
102+ fragment : AnyStr
103+ def geturl (self ) -> AnyStr : ... # type: ignore[misc]
104+
105+ else :
106+ class _ParseResultBase (NamedTuple , Generic [AnyStr ]):
107+ scheme : AnyStr
108+ netloc : AnyStr
109+ path : AnyStr
110+ params : AnyStr
111+ query : AnyStr
112+ fragment : AnyStr
84113
85114# Structured result objects for string data
86115class DefragResult (_DefragResultBase [str ], _ResultMixinStr ):
@@ -102,6 +131,95 @@ class SplitResultBytes(_SplitResultBase[bytes], _NetlocResultMixinBytes):
102131class ParseResultBytes (_ParseResultBase [bytes ], _NetlocResultMixinBytes ):
103132 def geturl (self ) -> bytes : ...
104133
134+ if sys .version_info >= (3 , 15 ):
135+ @type_check_only
136+ class DefragResultMaybeNone (NamedTuple ):
137+ url : str
138+ fragment : str | None
139+ def encode (self , encoding : str = "ascii" , errors : str = "strict" ) -> DefragResultBytesMaybeNone : ...
140+ def geturl (self ) -> str : ...
141+
142+ @type_check_only
143+ class SplitResultMaybeNone (NamedTuple ):
144+ scheme : str | None
145+ netloc : str | None
146+ path : str
147+ query : str | None
148+ fragment : str | None
149+ @property
150+ def username (self ) -> str | None : ...
151+ @property
152+ def password (self ) -> str | None : ...
153+ @property
154+ def hostname (self ) -> str | None : ...
155+ @property
156+ def port (self ) -> int | None : ...
157+ def encode (self , encoding : str = "ascii" , errors : str = "strict" ) -> SplitResultBytesMaybeNone : ...
158+ def geturl (self ) -> str : ...
159+
160+ @type_check_only
161+ class ParseResultMaybeNone (NamedTuple ):
162+ scheme : str | None
163+ netloc : str | None
164+ path : str
165+ params : str | None
166+ query : str | None
167+ fragment : str | None
168+ @property
169+ def username (self ) -> str | None : ...
170+ @property
171+ def password (self ) -> str | None : ...
172+ @property
173+ def hostname (self ) -> str | None : ...
174+ @property
175+ def port (self ) -> int | None : ...
176+ def encode (self , encoding : str = "ascii" , errors : str = "strict" ) -> ParseResultBytesMaybeNone : ...
177+ def geturl (self ) -> str : ...
178+
179+ @type_check_only
180+ class DefragResultBytesMaybeNone (NamedTuple ):
181+ url : bytes
182+ fragment : bytes | None
183+ def decode (self , encoding : str = "ascii" , errors : str = "strict" ) -> DefragResultMaybeNone : ...
184+ def geturl (self ) -> bytes : ...
185+
186+ @type_check_only
187+ class SplitResultBytesMaybeNone (NamedTuple ):
188+ scheme : bytes | None
189+ netloc : bytes | None
190+ path : bytes
191+ query : bytes | None
192+ fragment : bytes | None
193+ @property
194+ def username (self ) -> bytes | None : ...
195+ @property
196+ def password (self ) -> bytes | None : ...
197+ @property
198+ def hostname (self ) -> bytes | None : ...
199+ @property
200+ def port (self ) -> int | None : ...
201+ def decode (self , encoding : str = "ascii" , errors : str = "strict" ) -> SplitResultMaybeNone : ...
202+ def geturl (self ) -> bytes : ...
203+
204+ @type_check_only
205+ class ParseResultBytesMaybeNone (NamedTuple ):
206+ scheme : bytes | None
207+ netloc : bytes | None
208+ path : bytes
209+ params : bytes | None
210+ query : bytes | None
211+ fragment : bytes | None
212+ @property
213+ def username (self ) -> bytes | None : ...
214+ @property
215+ def password (self ) -> bytes | None : ...
216+ @property
217+ def hostname (self ) -> bytes | None : ...
218+ @property
219+ def port (self ) -> int | None : ...
220+ def decode (self , encoding : str = "ascii" , errors : str = "strict" ) -> ParseResultMaybeNone : ...
221+ def geturl (self ) -> bytes : ...
222+
105223def parse_qs (
106224 qs : AnyStr | None ,
107225 keep_blank_values : bool = False ,
@@ -137,6 +255,20 @@ def urldefrag(url: str) -> DefragResult: ...
137255@overload
138256def urldefrag (url : bytes | bytearray | None ) -> DefragResultBytes : ...
139257
258+ if sys .version_info >= (3 , 15 ):
259+ @overload
260+ def urldefrag (url : str , * , missing_as_none : Literal [True ]) -> DefragResultMaybeNone : ...
261+ @overload
262+ def urldefrag (url : str , * , missing_as_none : Literal [False ] = False ) -> DefragResult : ...
263+ @overload
264+ def urldefrag (url : bytes | bytearray | None , * , missing_as_none : Literal [True ]) -> DefragResultBytesMaybeNone : ...
265+ @overload
266+ def urldefrag (url : bytes | bytearray | None , * , missing_as_none : Literal [False ] = False ) -> DefragResultBytes : ...
267+ @overload
268+ def urldefrag (url : str , * , missing_as_none : bool ) -> DefragResult | DefragResultMaybeNone : ...
269+ @overload
270+ def urldefrag (url : bytes | bytearray | None , * , missing_as_none : bool ) -> DefragResultBytes | DefragResultBytesMaybeNone : ...
271+
140272# The values are passed through `str()` (unless they are bytes), so anything is valid.
141273_QueryType : TypeAlias = (
142274 Mapping [str , object ]
@@ -171,6 +303,45 @@ def urlparse(url: str, scheme: str = "", allow_fragments: bool = True) -> ParseR
171303def urlparse (
172304 url : bytes | bytearray | None , scheme : bytes | bytearray | None | Literal ["" ] = "" , allow_fragments : bool = True
173305) -> ParseResultBytes : ...
306+
307+ if sys .version_info >= (3 , 15 ):
308+ @overload
309+ def urlparse (
310+ url : str , scheme : str = "" , allow_fragments : bool = True , * , missing_as_none : Literal [True ]
311+ ) -> ParseResultMaybeNone : ...
312+ @overload
313+ def urlparse (
314+ url : str , scheme : str = "" , allow_fragments : bool = True , * , missing_as_none : Literal [False ] = False
315+ ) -> ParseResult : ...
316+ @overload
317+ def urlparse (
318+ url : bytes | bytearray | None ,
319+ scheme : bytes | bytearray | None | Literal ["" ] = "" ,
320+ allow_fragments : bool = True ,
321+ * ,
322+ missing_as_none : Literal [True ],
323+ ) -> ParseResultBytesMaybeNone : ...
324+ @overload
325+ def urlparse (
326+ url : bytes | bytearray | None ,
327+ scheme : bytes | bytearray | None | Literal ["" ] = "" ,
328+ allow_fragments : bool = True ,
329+ * ,
330+ missing_as_none : Literal [False ] = False ,
331+ ) -> ParseResultBytes : ...
332+ @overload
333+ def urlparse (
334+ url : str , scheme : str = "" , allow_fragments : bool = True , * , missing_as_none : bool
335+ ) -> ParseResult | ParseResultMaybeNone : ...
336+ @overload
337+ def urlparse (
338+ url : bytes | bytearray | None ,
339+ scheme : bytes | bytearray | None | Literal ["" ] = "" ,
340+ allow_fragments : bool = True ,
341+ * ,
342+ missing_as_none : bool ,
343+ ) -> ParseResultBytes | ParseResultBytesMaybeNone : ...
344+
174345@overload
175346def urlsplit (url : str , scheme : str = "" , allow_fragments : bool = True ) -> SplitResult : ...
176347
@@ -186,15 +357,66 @@ else:
186357 url : bytes | bytearray | None , scheme : bytes | bytearray | None | Literal ["" ] = "" , allow_fragments : bool = True
187358 ) -> SplitResultBytes : ...
188359
189- # Requires an iterable of length 6
190- @overload
191- def urlunparse (components : Iterable [None ]) -> Literal [b"" ]: ... # type: ignore[overload-overlap]
192- @overload
193- def urlunparse (components : Iterable [AnyStr | None ]) -> AnyStr : ...
360+ if sys .version_info >= (3 , 15 ):
361+ @overload
362+ def urlsplit (
363+ url : str , scheme : str = "" , allow_fragments : bool = True , * , missing_as_none : Literal [True ]
364+ ) -> SplitResultMaybeNone : ...
365+ @overload
366+ def urlsplit (
367+ url : str , scheme : str = "" , allow_fragments : bool = True , * , missing_as_none : Literal [False ] = False
368+ ) -> SplitResult : ...
369+ @overload
370+ def urlsplit (
371+ url : bytes | None ,
372+ scheme : bytes | None | Literal ["" ] = "" ,
373+ allow_fragments : bool = True ,
374+ * ,
375+ missing_as_none : Literal [True ],
376+ ) -> SplitResultBytesMaybeNone : ...
377+ @overload
378+ def urlsplit (
379+ url : bytes | None ,
380+ scheme : bytes | None | Literal ["" ] = "" ,
381+ allow_fragments : bool = True ,
382+ * ,
383+ missing_as_none : Literal [False ] = False ,
384+ ) -> SplitResultBytes : ...
385+ @overload
386+ def urlsplit (
387+ url : str , scheme : str = "" , allow_fragments : bool = True , * , missing_as_none : bool
388+ ) -> SplitResult | SplitResultMaybeNone : ...
389+ @overload
390+ def urlsplit (
391+ url : bytes | None , scheme : bytes | None | Literal ["" ] = "" , allow_fragments : bool = True , * , missing_as_none : bool
392+ ) -> SplitResultBytes | SplitResultBytesMaybeNone : ...
393+
394+ if sys .version_info >= (3 , 15 ):
395+ # Requires an iterable of length 6
396+ @overload
397+ def urlunparse (components : Iterable [None ], * , keep_empty : bool | None | Incomplete = ...) -> Literal [b"" ]: ... # type: ignore[overload-overlap]
398+ @overload
399+ def urlunparse (components : Iterable [AnyStr | None ], * , keep_empty : bool | None | Incomplete = ...) -> AnyStr : ...
400+
401+ else :
402+ # Requires an iterable of length 6
403+ @overload
404+ def urlunparse (components : Iterable [None ]) -> Literal [b"" ]: ... # type: ignore[overload-overlap]
405+ @overload
406+ def urlunparse (components : Iterable [AnyStr | None ]) -> AnyStr : ...
407+
408+ if sys .version_info >= (3 , 15 ):
409+ # Requires an iterable of length 5
410+ @overload
411+ def urlunsplit (components : Iterable [None ], * , keep_empty : bool | None | Incomplete = ...) -> Literal [b"" ]: ... # type: ignore[overload-overlap]
412+ @overload
413+ def urlunsplit (components : Iterable [AnyStr | None ], * , keep_empty : bool | None | Incomplete = ...) -> AnyStr : ...
414+
415+ else :
416+ # Requires an iterable of length 5
417+ @overload
418+ def urlunsplit (components : Iterable [None ]) -> Literal [b"" ]: ... # type: ignore[overload-overlap]
419+ @overload
420+ def urlunsplit (components : Iterable [AnyStr | None ]) -> AnyStr : ...
194421
195- # Requires an iterable of length 5
196- @overload
197- def urlunsplit (components : Iterable [None ]) -> Literal [b"" ]: ... # type: ignore[overload-overlap]
198- @overload
199- def urlunsplit (components : Iterable [AnyStr | None ]) -> AnyStr : ...
200422def unwrap (url : str ) -> str : ...
0 commit comments