From b4da2b694b6b6f40a9bad861d508cda75594fe52 Mon Sep 17 00:00:00 2001 From: Shantanu Date: Wed, 22 Jan 2020 17:11:52 -0800 Subject: [PATCH] csv: re-export Dialect from _csv (#3613) Resolves #3611 Tested with mypy on: ``` f = open("asdf.csv", "w") csv.writer(f) csv.writer(f, dialect=csv.excel) csv.writer(f, dialect=csv.excel()) csv.DictReader(f) csv.DictReader(f, dialect=csv.excel) csv.DictReader(f, dialect=csv.excel()) class CustomDialect(csv.Dialect): delimiter = "%" csv.writer(f, dialect=CustomDialect) csv.writer(f, dialect=CustomDialect()) ``` --- stdlib/2and3/_csv.pyi | 8 +++++--- stdlib/2and3/csv.pyi | 19 +++++-------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/stdlib/2and3/_csv.pyi b/stdlib/2and3/_csv.pyi index e74464976..4f722891b 100644 --- a/stdlib/2and3/_csv.pyi +++ b/stdlib/2and3/_csv.pyi @@ -1,6 +1,6 @@ import sys -from typing import Any, Iterable, Iterator, List, Optional, Protocol, Sequence, Text, Union +from typing import Any, Iterable, Iterator, List, Optional, Protocol, Sequence, Text, Type, Union QUOTE_ALL: int QUOTE_MINIMAL: int @@ -20,6 +20,8 @@ class Dialect: strict: int def __init__(self) -> None: ... +_DialectLike = Union[str, Dialect, Type[Dialect]] + class _reader(Iterator[List[str]]): dialect: Dialect line_num: int @@ -41,8 +43,8 @@ class _writer: class _Writer(Protocol): def write(self, s: str) -> Any: ... -def writer(csvfile: _Writer, dialect: Union[Dialect, str] = ..., **fmtparams: Any) -> _writer: ... -def reader(csvfile: Iterable[Text], dialect: Union[Dialect, str] = ..., **fmtparams: Any) -> _reader: ... +def writer(csvfile: _Writer, dialect: _DialectLike = ..., **fmtparams: Any) -> _writer: ... +def reader(csvfile: Iterable[Text], dialect: _DialectLike = ..., **fmtparams: Any) -> _reader: ... def register_dialect(name: str, dialect: Any = ..., **fmtparams: Any) -> None: ... def unregister_dialect(name: str) -> None: ... def get_dialect(name: str) -> Dialect: ... diff --git a/stdlib/2and3/csv.pyi b/stdlib/2and3/csv.pyi index e43078573..47d9f5b41 100644 --- a/stdlib/2and3/csv.pyi +++ b/stdlib/2and3/csv.pyi @@ -4,7 +4,9 @@ from _csv import ( QUOTE_MINIMAL as QUOTE_MINIMAL, QUOTE_NONE as QUOTE_NONE, QUOTE_NONNUMERIC as QUOTE_NONNUMERIC, + Dialect as Dialect, Error as Error, + _DialectLike, _reader, _writer, field_size_limit as field_size_limit, @@ -18,19 +20,8 @@ from _csv import ( from collections import OrderedDict from typing import Any, Dict, Iterable, Iterator, List, Mapping, Optional, Sequence, Text, Type, Union -_Dialect = Union[str, Dialect, Type[Dialect]] _DictRow = Mapping[str, Any] -class Dialect(object): - delimiter: str - quotechar: Optional[str] - escapechar: Optional[str] - doublequote: bool - skipinitialspace: bool - lineterminator: str - quoting: int - def __init__(self) -> None: ... - class excel(Dialect): delimiter: str quotechar: str @@ -62,7 +53,7 @@ class DictReader(Iterator[_DRMapping]): restkey: Optional[str] restval: Optional[str] reader: _reader - dialect: _Dialect + dialect: _DialectLike line_num: int fieldnames: Sequence[str] def __init__( @@ -71,7 +62,7 @@ class DictReader(Iterator[_DRMapping]): fieldnames: Optional[Sequence[str]] = ..., restkey: Optional[str] = ..., restval: Optional[str] = ..., - dialect: _Dialect = ..., + dialect: _DialectLike = ..., *args: Any, **kwds: Any, ) -> None: ... @@ -92,7 +83,7 @@ class DictWriter(object): fieldnames: Iterable[str], restval: Optional[Any] = ..., extrasaction: str = ..., - dialect: _Dialect = ..., + dialect: _DialectLike = ..., *args: Any, **kwds: Any, ) -> None: ...