Skip to content
Merged
Prev Previous commit
Next Next commit
single quote types
  • Loading branch information
hauntsaninja committed Apr 19, 2023
commit 30b29bb59bdcdb5ca0eba2178a554adf420d3fe5
2 changes: 1 addition & 1 deletion Lib/test/test_codeop.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ def test_filename(self):
def test_warning(self):
# Test that the warning is only returned once.
with warnings_helper.check_warnings(
('"is" with str literal', SyntaxWarning),
('"is" with \'str\' literal', SyntaxWarning),
("invalid escape sequence", SyntaxWarning),
) as w:
compile_command(r"'\e' is 0")
Expand Down
20 changes: 10 additions & 10 deletions Lib/test/test_grammar.py
Original file line number Diff line number Diff line change
Expand Up @@ -1470,16 +1470,16 @@ def test_comparison_is_literal(self):
def check(test, msg):
self.check_syntax_warning(test, msg)

check('x is 1', '"is" with int literal')
check('x is "thing"', '"is" with str literal')
check('1 is x', '"is" with int literal')
check('x is y is 1', '"is" with int literal')
check('x is not 1', '"is not" with int literal')
check('x is not (1, 2)', '"is not" with tuple literal')
check('(1, 2) is not x', '"is not" with tuple literal')

check('None is 1', '"is" with int literal')
check('1 is None', '"is" with int literal')
check('x is 1', '"is" with \'int\' literal')
check('x is "thing"', '"is" with \'str\' literal')
check('1 is x', '"is" with \'int\' literal')
check('x is y is 1', '"is" with \'int\' literal')
check('x is not 1', '"is not" with \'int\' literal')
check('x is not (1, 2)', '"is not" with \'tuple\' literal')
check('(1, 2) is not x', '"is not" with \'tuple\' literal')

check('None is 1', '"is" with \'int\' literal')
check('1 is None', '"is" with \'int\' literal')

with warnings.catch_warnings():
warnings.simplefilter('error', SyntaxWarning)
Expand Down
4 changes: 2 additions & 2 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -2285,8 +2285,8 @@ check_compare(struct compiler *c, expr_ty e)
if (op == Is || op == IsNot) {
if (!right || !left) {
const char *msg = (op == Is)
? "\"is\" with %.200s literal. Did you mean \"==\"?"
: "\"is not\" with %.200s literal. Did you mean \"!=\"?";
? "\"is\" with '%.200s' literal. Did you mean \"==\"?"
: "\"is not\" with '%.200s' literal. Did you mean \"!=\"?";
expr_ty literal = !left ? e->v.Compare.left : right_expr;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

left gets updated in each iteration, but e->v.Compare.left is always the same thing. Is this correct?

Should we just check the first item before the loop and then here just look at right_expr?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be missing something, but bool left = check_is_arg(e->v.Compare.left); happens once outside the loop and it's only right that is updated in each iteration.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

line 2296?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, of course! Thank you so much, this is buggy. I added the fix and a test case to catch the issue.

I think we can't do the first item check before the loop since all comparators may not be is, e.g. x == 3 is y, but let me know if I'm missing something!

return compiler_warn(
c, LOC(e), msg, Py_TYPE(literal->v.Constant.value)->tp_name
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c, LOC(e), msg, Py_TYPE(literal->v.Constant.value)->tp_name
c, LOC(e), msg, infer_type(literal)->tp_name

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had this originally, but it needed a forward reference / we know it's a Constant_kind so we could skip the switch :-)

I'll add it back!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed, let me know if I should move the function instead

Expand Down