urlparse: allow unicode arguments in more places (#1451)

* urlparse: allow unicode arguments in more places

Part of #1411

urlunsplit() and similar functions accept either unicode or str in all
places. Their actual return type is unicode if any of the arguments is
unicode and nonempty, which the type system can't exactly express. I
left the return type as str because str is implicitly promoted to
unicode, so using the return type in a place that accepts unicode should
work.

unquote, parse_qs, and parse_qsl return unicode if you pass them unicode,
so AnyStr is appropriate in their stubs.

* fix type for urldefrag

The return type was wrong; this function returns a 2-tuple. The second member of the tuple is always a `str` if the argument type does not contain '#', and otherwise matches the type of the argument.
This commit is contained in:
Jelle Zijlstra
2017-07-04 19:20:23 -07:00
committed by Matthias Kramm
parent fee2eaae30
commit 9947c9d513

View File

@@ -1,6 +1,8 @@
# Stubs for urlparse (Python 2)
from typing import Dict, List, NamedTuple, Tuple, Sequence, Union, overload
from typing import AnyStr, Dict, List, NamedTuple, Tuple, Sequence, Union, overload
_String = Union[str, unicode]
uses_relative = ... # type: List[str]
uses_netloc = ... # type: List[str]
@@ -46,23 +48,23 @@ class ParseResult(
):
def geturl(self) -> str: ...
def urlparse(url: Union[str, unicode], scheme: str = ...,
def urlparse(url: _String, scheme: _String = ...,
allow_fragments: bool = ...) -> ParseResult: ...
def urlsplit(url: Union[str, unicode], scheme: str = ...,
def urlsplit(url: _String, scheme: _String = ...,
allow_fragments: bool = ...) -> SplitResult: ...
@overload
def urlunparse(data: Tuple[str, str, str, str, str, str]) -> str: ...
def urlunparse(data: Tuple[_String, _String, _String, _String, _String, _String]) -> str: ...
@overload
def urlunparse(data: Sequence[str]) -> str: ...
def urlunparse(data: Sequence[_String]) -> str: ...
@overload
def urlunsplit(data: Tuple[str, str, str, str, str]) -> str: ...
def urlunsplit(data: Tuple[_String, _String, _String, _String, _String]) -> str: ...
@overload
def urlunsplit(data: Sequence[str]) -> str: ...
def urljoin(base: Union[str, unicode], url: Union[str, unicode],
def urlunsplit(data: Sequence[_String]) -> str: ...
def urljoin(base: _String, url: _String,
allow_fragments: bool = ...) -> str: ...
def urldefrag(url: Union[str, unicode]) -> str: ...
def unquote(s: str) -> str: ...
def parse_qs(qs: str, keep_blank_values: bool = ...,
strict_parsing: bool = ...) -> Dict[str, List[str]]: ...
def parse_qsl(qs: str, keep_blank_values: int = ...,
strict_parsing: bool = ...) -> List[Tuple[str, str]]: ...
def urldefrag(url: AnyStr) -> Tuple[AnyStr, str]: ...
def unquote(s: AnyStr) -> AnyStr: ...
def parse_qs(qs: AnyStr, keep_blank_values: bool = ...,
strict_parsing: bool = ...) -> Dict[AnyStr, List[AnyStr]]: ...
def parse_qsl(qs: AnyStr, keep_blank_values: int = ...,
strict_parsing: bool = ...) -> List[Tuple[AnyStr, AnyStr]]: ...