-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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
Parse each format-string component separately #3390
Parse each format-string component separately #3390
Conversation
test-data/unit/check-newsyntax.test
Outdated
[case testNewSyntaxFStringSingleField] | ||
# flags: --python-version 3.6 | ||
v = 1 | ||
f'{v}' + '' |
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.
I'd write reveal_type(f'{v}') # E: Revealed type is 'builtins.str'
, which tests more explicitly what you want to achieve.
test-data/unit/fixtures/f_string.pyi
Outdated
|
||
T = TypeVar('T') | ||
|
||
@builtinclass |
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.
Curious, what does this do? I haven't seen it before and grep shows no uses outside of test fixtures.
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.
I don't know, I think nothing -- maybe it's a relic? I just copied that code from fixtures/list.pyi. I've removed it.
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.
Just nits, this is basically right.
mypy/fastparse.py
Outdated
format_args, | ||
format_arg_kinds) | ||
"""Each of n.values is a str or FormattedValue; we just concatenate | ||
them all using ''.join.""" |
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.
I think this should be a comment, not a docstring. Ditto below. (Docstrings are more for the users of a function, comments are for readers of the function body.)
test-data/unit/fixtures/f_string.pyi
Outdated
def __mul__(self, x: int) -> list[T]: pass | ||
def __getitem__(self, x: int) -> T: pass | ||
def append(self, x: T) -> None: pass | ||
def extend(self, x: Iterable[T]) -> None: pass |
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.
You probably don't need all these methods.
Fixes python#3385. The old code evaluated each FormattedValue as an expression potentially returning the type of the value, rather than a string. But that's wrong, because a FormattedValue can exist on its own when it's not being joined to any other format strings. The new code evaluates each FormattedValue by synthesizing '{}'.format(expr) and then, if necessary, joins them in JoinedStr using ''.join(items).
d4fba25
to
a564e4b
Compare
a564e4b
to
f586e2d
Compare
Ready for re-review. |
Thanks! |
* master: (23 commits) Make return type of open() more precise (python#3477) Add test cases that delete a file during incremental checking (python#3461) Parse each format-string component separately (python#3390) Don't warn about returning Any if it is a proper subtype of the return type (python#3473) Add __setattr__ support (python#3451) Remove bundled lib-typing (python#3337) Move version of extensions to post-release (python#3348) Fix None slice bounds with strict-optional (python#3445) Allow NewType subclassing NewType. (python#3465) Add console scripts (python#3074) Fix 'variance' label. Change label for variance section to just 'variance' (python#3429) Better error message for invalid package names passed to mypy (python#3447) Fix last character cut in html-report if file does not end with newline (python#3466) Print pytest output as it happens (python#3463) Add mypy roadmap (python#3460) Add flag to avoid interpreting arguments with a default of None as Optional (python#3248) Add type checking plugin support for functions (python#3299) Mismatch of inferred type and return type note (python#3428) Sync typeshed (python#3449) ...
Fixes #3385.
The old code evaluated each FormattedValue as an expression potentially returning the type of the value, rather than a string. But that's wrong, because a FormattedValue can exist on its own when it's not being joined to any other format strings + those FormattedValues need type str. The new code evaluates each FormattedValue by synthesizing '{}'.format(expr) and then, if necessary, joins them in JoinedStr using ''.join(items).
I had to create a new unittest fixture for this with list, str, and int.