-
-
Notifications
You must be signed in to change notification settings - Fork 18.7k
TYP use typeddict to define cssdict #40947
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
8166430
3c98fcb
af5b3b8
1d5c6c1
ab033a0
b6aa69f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,7 +12,6 @@ | |
Sequence, | ||
Tuple, | ||
Union, | ||
cast, | ||
) | ||
from uuid import uuid4 | ||
|
||
|
@@ -21,7 +20,10 @@ | |
from pandas._config import get_option | ||
|
||
from pandas._libs import lib | ||
from pandas._typing import FrameOrSeriesUnion | ||
from pandas._typing import ( | ||
FrameOrSeriesUnion, | ||
TypedDict, | ||
) | ||
from pandas.compat._optional import import_optional_dependency | ||
|
||
from pandas.core.dtypes.generic import ABCSeries | ||
|
@@ -45,10 +47,14 @@ | |
CSSPair = Tuple[str, Union[str, int, float]] | ||
CSSList = List[CSSPair] | ||
CSSProperties = Union[str, CSSList] | ||
CSSStyles = List[Dict[str, CSSProperties]] # = List[CSSDict] | ||
# class CSSDict(TypedDict): # available when TypedDict is valid in pandas | ||
# selector: str | ||
# props: CSSProperties | ||
|
||
|
||
class CSSDict(TypedDict): | ||
selector: str | ||
props: CSSProperties | ||
|
||
|
||
CSSStyles = List[CSSDict] | ||
|
||
|
||
class StylerRenderer: | ||
|
@@ -597,9 +603,9 @@ def _format_table_styles(styles: CSSStyles) -> CSSStyles: | |
return [ | ||
item | ||
for sublist in [ | ||
[ # this is a CSSDict when TypedDict is available to avoid cast. | ||
{"selector": x, "props": style["props"]} | ||
for x in cast(str, style["selector"]).split(",") | ||
[ | ||
CSSDict(selector=x, props=style["props"]) | ||
for x in style["selector"].split(",") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think you should need to create the CSSDict explicitly. mypy should check if the expression is a compatible type
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. just tried that and got
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it maybe a mypy cache thing. maybe better then to use for loops and append starting with css_dict : CSSDict = [] the list comp with 4 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. hmm, seems ok
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
should have been css_styles : CSSStyles = [] There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Seems like you're right! Seems like ret = [
{"selector": selector, "props": css_dict["props"]}
for css_dict in styles
for selector in css_dict["selector"].split(",")
]
return ret throws a mypy error, while return [
{"selector": selector, "props": css_dict["props"]}
for css_dict in styles
for selector in css_dict["selector"].split(",")
] doesn't - I wasn't expecting them to be different, and I had the former pattern, sorry about that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yep. mypy will infer the type of the intermediate variable instead of checking the return expression against the return type. could use... ret: CSSStyles = ... and mypy will check the list comp is compatible the variable type declaration There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thanks for explaining/merging! will copy-and-paste next time |
||
] | ||
for style in styles | ||
] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if we don't need to use the TypedDict at runtime, then we would not need this and we could only use TypedDict in TYPE_CHECKING blocks.
I see the downside being that aliases (and imports of aliases) would also need to be defined in the TYPE_CHECKING block and that we would not be able to construct the TypedDict explicitly in code. but that could be an upside.
no strong preference here yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thinking some more. leave this for now.
from NEP 29, Dec 26, 2021 drop support for Python 3.7
so we should be able to drop python 3.7 on master after the 1.3 release.