Skip to content

Commit 9fe5dba

Browse files
authored
REF: extract dialect validation (#37332)
1 parent f590254 commit 9fe5dba

File tree

1 file changed

+48
-25
lines changed

1 file changed

+48
-25
lines changed

pandas/io/parsers.py

+48-25
Original file line numberDiff line numberDiff line change
@@ -794,10 +794,8 @@ def __init__(self, f, engine=None, **kwds):
794794

795795
_validate_skipfooter(kwds)
796796

797-
if kwds.get("dialect") is not None:
798-
dialect = kwds["dialect"]
799-
if dialect in csv.list_dialects():
800-
dialect = csv.get_dialect(dialect)
797+
dialect = _extract_dialect(kwds)
798+
if dialect is not None:
801799
kwds = _merge_with_dialect_properties(dialect, kwds)
802800

803801
if kwds.get("header", "infer") == "infer":
@@ -3739,6 +3737,50 @@ def _refine_defaults_read(
37393737
return kwds
37403738

37413739

3740+
def _extract_dialect(kwds: Dict[str, Any]) -> Optional[csv.Dialect]:
3741+
"""
3742+
Extract concrete csv dialect instance.
3743+
3744+
Returns
3745+
-------
3746+
csv.Dialect or None
3747+
"""
3748+
if kwds.get("dialect") is None:
3749+
return None
3750+
3751+
dialect = kwds["dialect"]
3752+
if dialect in csv.list_dialects():
3753+
dialect = csv.get_dialect(dialect)
3754+
3755+
_validate_dialect(dialect)
3756+
3757+
return dialect
3758+
3759+
3760+
MANDATORY_DIALECT_ATTRS = (
3761+
"delimiter",
3762+
"doublequote",
3763+
"escapechar",
3764+
"skipinitialspace",
3765+
"quotechar",
3766+
"quoting",
3767+
)
3768+
3769+
3770+
def _validate_dialect(dialect: csv.Dialect) -> None:
3771+
"""
3772+
Validate csv dialect instance.
3773+
3774+
Raises
3775+
------
3776+
ValueError
3777+
If incorrect dialect is provided.
3778+
"""
3779+
for param in MANDATORY_DIALECT_ATTRS:
3780+
if not hasattr(dialect, param):
3781+
raise ValueError(f"Invalid dialect {dialect} provided")
3782+
3783+
37423784
def _merge_with_dialect_properties(
37433785
dialect: csv.Dialect,
37443786
defaults: Dict[str, Any],
@@ -3757,30 +3799,11 @@ def _merge_with_dialect_properties(
37573799
-------
37583800
kwds : dict
37593801
Updated keyword arguments, merged with dialect parameters.
3760-
3761-
Raises
3762-
------
3763-
ValueError
3764-
If incorrect dialect is provided.
37653802
"""
37663803
kwds = defaults.copy()
37673804

3768-
# Any valid dialect should have these attributes.
3769-
# If any are missing, we will raise automatically.
3770-
mandatory_dialect_attrs = (
3771-
"delimiter",
3772-
"doublequote",
3773-
"escapechar",
3774-
"skipinitialspace",
3775-
"quotechar",
3776-
"quoting",
3777-
)
3778-
3779-
for param in mandatory_dialect_attrs:
3780-
try:
3781-
dialect_val = getattr(dialect, param)
3782-
except AttributeError as err:
3783-
raise ValueError(f"Invalid dialect {dialect} provided") from err
3805+
for param in MANDATORY_DIALECT_ATTRS:
3806+
dialect_val = getattr(dialect, param)
37843807

37853808
parser_default = _parser_defaults[param]
37863809
provided = kwds.get(param, parser_default)

0 commit comments

Comments
 (0)