diff --git a/README.md b/README.md
index d7d5e9c..dff27e7 100644
--- a/README.md
+++ b/README.md
@@ -90,6 +90,17 @@ u'\d'   # u'\\d'
 # but in python3.x, that's our friend ☃
 ```
 
+### `is` / `is not` comparison to constant literals
+
+In python3.8+, comparison to literals becomes a `SyntaxWarning` as the success
+of those comparisons is implementation specific (due to common object caching).
+
+```python
+x is 5      # x == 5
+x is not 5  # x != 5
+x is 'foo'  # x == foo
+```
+
 ### `ur` string literals
 
 `ur'...'` literals are not valid in python 3.x
diff --git a/pyupgrade.py b/pyupgrade.py
index 221c87f..b67cbf7 100644
--- a/pyupgrade.py
+++ b/pyupgrade.py
@@ -324,13 +324,34 @@ def _process_dict_comp(tokens, start, arg):
     tokens[start:start + 2] = [Token('OP', '{')]
 
 
-class FindDictsSetsVisitor(ast.NodeVisitor):
-    def __init__(self):
+def _process_is_literal(tokens, i, compare):
+    while tokens[i].src != 'is':
+        i -= 1
+    if isinstance(compare, ast.Is):
+        tokens[i] = tokens[i]._replace(src='==')
+    else:
+        tokens[i] = tokens[i]._replace(src='!=')
+        # since we iterate backward, the dummy tokens keep the same length
+        i += 1
+        while tokens[i].src != 'not':
+            tokens[i] = Token('DUMMY', '')
+            i += 1
+        tokens[i] = Token('DUMMY', '')
+
+
+LITERAL_TYPES = (ast.Str, ast.Num)
+if sys.version_info >= (3,):  # pragma: no cover (py3+)
+    LITERAL_TYPES += (ast.Bytes,)
+
+
+class Py2CompatibleVisitor(ast.NodeVisitor):
+    def __init__(self):  # type: () -> None
         self.dicts = {}
         self.sets = {}
         self.set_empty_literals = {}
+        self.is_literal = {}
 
-    def visit_Call(self, node):
+    def visit_Call(self, node):  # type: (ast.AST) -> None
         if (
                 isinstance(node.func, ast.Name) and
                 node.func.id == 'set' and
@@ -357,15 +378,35 @@ class FindDictsSetsVisitor(ast.NodeVisitor):
             self.dicts[_ast_to_offset(node.func)] = arg
         self.generic_visit(node)
 
+    def visit_Compare(self, node):  # type: (ast.AST) -> None
+        left = node.left
+        for op, right in zip(node.ops, node.comparators):
+            if (
+                    isinstance(op, (ast.Is, ast.IsNot)) and
+                    (
+                        isinstance(left, LITERAL_TYPES) or
+                        isinstance(right, LITERAL_TYPES)
+                    )
+            ):
+                self.is_literal[_ast_to_offset(right)] = op
+            left = right
 
-def _fix_dict_set(contents_text):
+        self.generic_visit(node)
+
+
+def _fix_py2_compatible(contents_text):
     try:
         ast_obj = ast_parse(contents_text)
     except SyntaxError:
         return contents_text
-    visitor = FindDictsSetsVisitor()
+    visitor = Py2CompatibleVisitor()
     visitor.visit(ast_obj)
-    if not any((visitor.dicts, visitor.sets, visitor.set_empty_literals)):
+    if not any((
+            visitor.dicts,
+            visitor.sets,
+            visitor.set_empty_literals,
+            visitor.is_literal,
+    )):
         return contents_text
 
     tokens = src_to_tokens(contents_text)
@@ -376,6 +417,8 @@ def _fix_dict_set(contents_text):
             _process_set_empty_literal(tokens, i)
         elif token.offset in visitor.sets:
             _process_set_literal(tokens, i, visitor.sets[token.offset])
+        elif token.offset in visitor.is_literal:
+            _process_is_literal(tokens, i, visitor.is_literal[token.offset])
     return tokens_to_src(tokens)
 
 
@@ -1401,7 +1444,7 @@ def fix_file(filename, args):
         print('{} is non-utf-8 (not supported)'.format(filename))
         return 1
 
-    contents_text = _fix_dict_set(contents_text)
+    contents_text = _fix_py2_compatible(contents_text)
     contents_text = _fix_format_literals(contents_text)
     contents_text = _fix_tokens(contents_text, args.py3_plus)
     if not args.keep_percent_format:

diff --git a/tests/pyupgrade_test.py b/tests/pyupgrade_test.py
index 8282b62..9ab97d3 100644
--- a/tests/pyupgrade_test.py
+++ b/tests/pyupgrade_test.py
@@ -7,10 +7,10 @@ import sys
 
 import pytest
 
-from pyupgrade import _fix_dict_set
 from pyupgrade import _fix_format_literals
 from pyupgrade import _fix_fstrings
 from pyupgrade import _fix_percent_format
+from pyupgrade import _fix_py2_compatible
 from pyupgrade import _fix_six_and_classes
 from pyupgrade import _fix_super
 from pyupgrade import _fix_tokens
@@ -120,7 +120,7 @@ def test_intentionally_not_round_trip(s, expected):
     ),
 )
 def test_sets(s, expected):
-    ret = _fix_dict_set(s)
+    ret = _fix_py2_compatible(s)
     assert ret == expected
 
 
@@ -139,8 +139,8 @@ def test_sets(s, expected):
         ),
     ),
 )
-def test_sets_generators_trailing_comas(s, expected):
-    ret = _fix_dict_set(s)
+def test_sets_generators_trailing_commas(s, expected):
+    ret = _fix_py2_compatible(s)
     assert ret == expected
 
 
@@ -216,7 +216,69 @@ def test_sets_generators_trailing_comas(s, expected):
     ),
 )
 def test_dictcomps(s, expected):
-    ret = _fix_dict_set(s)
+    ret = _fix_py2_compatible(s)
+    assert ret == expected
+
+
+@pytest.mark.parametrize(
+    's',
+    (
+        'x is True',
+        'x is False',
+        'x is None',
+        'x is (not 5)',
+        'x is 5 + 5',
+        # pyupgrade is timid about containers since the original can be
+        # always-False, but the rewritten code could be `True`.
+        'x is ()',
+        'x is []',
+        'x is {}',
+        'x is {1}',
+    ),
+)
+def test_fix_is_compare_to_literal_noop(s):
+    assert _fix_py2_compatible(s) == s
+
+
+@pytest.mark.parametrize(
+    ('s', 'expected'),
+    (
+        pytest.param('x is 5', 'x == 5', id='`is`'),
+        pytest.param('x is not 5', 'x != 5', id='`is not`'),
+        pytest.param('x is ""', 'x == ""', id='string'),
+        pytest.param('x is u""', 'x == u""', id='unicode string'),
+        pytest.param('x is b""', 'x == b""', id='bytes'),
+        pytest.param('x is 1.5', 'x == 1.5', id='float'),
+        pytest.param('x == 5 is 5', 'x == 5 == 5', id='compound compare'),
+        pytest.param(
+            'if (\n'
+            '    x is\n'
+            '    5\n'
+            '): pass\n',
+
+            'if (\n'
+            '    x ==\n'
+            '    5\n'
+            '): pass\n',
+
+            id='multi-line `is`',
+        ),
+        pytest.param(
+            'if (\n'
+            '    x is\n'
+            '    not 5\n'
+            '): pass\n',
+
+            'if (\n'
+            '    x != 5\n'
+            '): pass\n',
+
+            id='multi-line `is not`',
+        ),
+    ),
+)
+def test_fix_is_compare_to_literal(s, expected):
+    ret = _fix_py2_compatible(s)
     assert ret == expected
 
 

Fix `is (int, float, bytes, str)` automatically
Similar to #47, let's automatically fix this as it becomes a `SyntaxWarning` in python3.8

```pycon
$ python3.8 -Werror
Python 3.8.0a3 (default, Mar 27 2019, 03:46:44) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 5
>>> x is 5
  File "<stdin>", line 1
SyntaxError: "is" with a literal. Did you mean "=="?
>>> 
```
tests/pyupgrade_test.py::test_roundtrip_text[] tests/pyupgrade_test.py::test_roundtrip_text[foo] tests/pyupgrade_test.py::test_roundtrip_text[{}] tests/pyupgrade_test.py::test_roundtrip_text[{0}] tests/pyupgrade_test.py::test_roundtrip_text[{named}] tests/pyupgrade_test.py::test_roundtrip_text[{!r}] tests/pyupgrade_test.py::test_roundtrip_text[{:>5}] tests/pyupgrade_test.py::test_roundtrip_text[{{] tests/pyupgrade_test.py::test_roundtrip_text[}}] tests/pyupgrade_test.py::test_roundtrip_text[{0!s:15}] tests/pyupgrade_test.py::test_intentionally_not_round_trip[{:}-{}] tests/pyupgrade_test.py::test_intentionally_not_round_trip[{0:}-{0}] tests/pyupgrade_test.py::test_intentionally_not_round_trip[{0!r:}-{0!r}] tests/pyupgrade_test.py::test_sets[set()-set()] tests/pyupgrade_test.py::test_sets[set((\n))-set((\n))] tests/pyupgrade_test.py::test_sets[set tests/pyupgrade_test.py::test_sets[set(())-set()] tests/pyupgrade_test.py::test_sets[set([])-set()] tests/pyupgrade_test.py::test_sets[set(( tests/pyupgrade_test.py::test_sets[set((1, tests/pyupgrade_test.py::test_sets[set([1, tests/pyupgrade_test.py::test_sets[set(x tests/pyupgrade_test.py::test_sets[set([x tests/pyupgrade_test.py::test_sets[set((x tests/pyupgrade_test.py::test_sets[set(((1, tests/pyupgrade_test.py::test_sets[set((a, tests/pyupgrade_test.py::test_sets[set([(1, tests/pyupgrade_test.py::test_sets[set(\n tests/pyupgrade_test.py::test_sets[set([((1, tests/pyupgrade_test.py::test_sets[set((((1, tests/pyupgrade_test.py::test_sets[set(\n(1, tests/pyupgrade_test.py::test_sets[set((\n1,\n2,\n))\n-{\n1,\n2,\n}\n] tests/pyupgrade_test.py::test_sets[set((frozenset(set((1, tests/pyupgrade_test.py::test_sets[set((1,))-{1}] tests/pyupgrade_test.py::test_dictcomps[x tests/pyupgrade_test.py::test_dictcomps[dict()-dict()] tests/pyupgrade_test.py::test_dictcomps[(-(] tests/pyupgrade_test.py::test_dictcomps[dict tests/pyupgrade_test.py::test_dictcomps[dict((a, tests/pyupgrade_test.py::test_dictcomps[dict([a, tests/pyupgrade_test.py::test_dictcomps[dict(((a, tests/pyupgrade_test.py::test_dictcomps[dict([(a, tests/pyupgrade_test.py::test_dictcomps[dict(((a), tests/pyupgrade_test.py::test_dictcomps[dict((k, tests/pyupgrade_test.py::test_dictcomps[dict(\n tests/pyupgrade_test.py::test_dictcomps[x(\n tests/pyupgrade_test.py::test_fix_is_compare_to_literal_noop[x tests/pyupgrade_test.py::test_fix_is_compare_to_literal[`is`] tests/pyupgrade_test.py::test_fix_is_compare_to_literal[`is tests/pyupgrade_test.py::test_fix_is_compare_to_literal[string] tests/pyupgrade_test.py::test_fix_is_compare_to_literal[unicode tests/pyupgrade_test.py::test_fix_is_compare_to_literal[bytes] tests/pyupgrade_test.py::test_fix_is_compare_to_literal[float] tests/pyupgrade_test.py::test_fix_is_compare_to_literal[compound tests/pyupgrade_test.py::test_fix_is_compare_to_literal[multi-line tests/pyupgrade_test.py::test_format_literals["{0}"format(1)-"{0}"format(1)] tests/pyupgrade_test.py::test_format_literals['{}'.format(1)-'{}'.format(1)] tests/pyupgrade_test.py::test_format_literals['{'.format(1)-'{'.format(1)] tests/pyupgrade_test.py::test_format_literals['}'.format(1)-'}'.format(1)] tests/pyupgrade_test.py::test_format_literals[x tests/pyupgrade_test.py::test_format_literals['{0} tests/pyupgrade_test.py::test_format_literals['{0}'.format(1)-'{}'.format(1)] tests/pyupgrade_test.py::test_format_literals['{0:x}'.format(30)-'{:x}'.format(30)] tests/pyupgrade_test.py::test_format_literals['''{0}\n{1}\n'''.format(1, tests/pyupgrade_test.py::test_format_literals['{0}' tests/pyupgrade_test.py::test_format_literals[print(\n tests/pyupgrade_test.py::test_format_literals['{0:<{1}}'.format(1, tests/pyupgrade_test.py::test_imports_unicode_literals[import tests/pyupgrade_test.py::test_imports_unicode_literals[from tests/pyupgrade_test.py::test_imports_unicode_literals[x tests/pyupgrade_test.py::test_imports_unicode_literals["""docstring"""\nfrom tests/pyupgrade_test.py::test_unicode_literals[(-False-(] tests/pyupgrade_test.py::test_unicode_literals[u''-False-u''] tests/pyupgrade_test.py::test_unicode_literals[u''-True-''] tests/pyupgrade_test.py::test_unicode_literals[from tests/pyupgrade_test.py::test_unicode_literals["""with tests/pyupgrade_test.py::test_unicode_literals[Regression: tests/pyupgrade_test.py::test_fix_ur_literals[basic tests/pyupgrade_test.py::test_fix_ur_literals[upper tests/pyupgrade_test.py::test_fix_ur_literals[with tests/pyupgrade_test.py::test_fix_ur_literals[emoji] tests/pyupgrade_test.py::test_fix_ur_literals_gets_fixed_before_u_removed tests/pyupgrade_test.py::test_fix_escape_sequences_noop[""] tests/pyupgrade_test.py::test_fix_escape_sequences_noop[r"\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences_noop[r'\\d'] tests/pyupgrade_test.py::test_fix_escape_sequences_noop[r"""\\d"""] tests/pyupgrade_test.py::test_fix_escape_sequences_noop[r'''\\d'''] tests/pyupgrade_test.py::test_fix_escape_sequences_noop[rb"\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences_noop["\\\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences_noop["\\u2603"] tests/pyupgrade_test.py::test_fix_escape_sequences_noop["\\r\\n"] tests/pyupgrade_test.py::test_fix_escape_sequences_noop["""\\\n"""] tests/pyupgrade_test.py::test_fix_escape_sequences_noop["""\\\r\n"""] tests/pyupgrade_test.py::test_fix_escape_sequences_noop["""\\\r"""] tests/pyupgrade_test.py::test_fix_escape_sequences["\\d"-r"\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences["\\n\\d"-"\\n\\\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences[u"\\d"-u"\\\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences[b"\\d"-br"\\d"] tests/pyupgrade_test.py::test_fix_escape_sequences["\\8"-r"\\8"] tests/pyupgrade_test.py::test_fix_escape_sequences["\\9"-r"\\9"] tests/pyupgrade_test.py::test_fix_escape_sequences[b"\\u2603"-br"\\u2603"] tests/pyupgrade_test.py::test_fix_escape_sequences["""\\\n\\q"""-"""\\\n\\\\q"""] tests/pyupgrade_test.py::test_fix_escape_sequences["""\\\r\n\\q"""-"""\\\r\n\\\\q"""] tests/pyupgrade_test.py::test_fix_escape_sequences["""\\\r\\q"""-"""\\\r\\\\q"""] tests/pyupgrade_test.py::test_noop_octal_literals[0] tests/pyupgrade_test.py::test_noop_octal_literals[00] tests/pyupgrade_test.py::test_noop_octal_literals[1] tests/pyupgrade_test.py::test_noop_octal_literals[12345] tests/pyupgrade_test.py::test_noop_octal_literals[1.2345] tests/pyupgrade_test.py::test_fix_extra_parens_noop[print("hello tests/pyupgrade_test.py::test_fix_extra_parens_noop[print((1, tests/pyupgrade_test.py::test_fix_extra_parens_noop[print(())] tests/pyupgrade_test.py::test_fix_extra_parens_noop[print((\n))] tests/pyupgrade_test.py::test_fix_extra_parens_noop[sum((block.code tests/pyupgrade_test.py::test_fix_extra_parens[print(("hello tests/pyupgrade_test.py::test_fix_extra_parens[print(("foo{}".format(1)))-print("foo{}".format(1))] tests/pyupgrade_test.py::test_fix_extra_parens[print((((1))))-print(1)] tests/pyupgrade_test.py::test_fix_extra_parens[print(\n tests/pyupgrade_test.py::test_is_bytestring_true[b''] tests/pyupgrade_test.py::test_is_bytestring_true[b""] tests/pyupgrade_test.py::test_is_bytestring_true[B""] tests/pyupgrade_test.py::test_is_bytestring_true[B''] tests/pyupgrade_test.py::test_is_bytestring_true[rb''0] tests/pyupgrade_test.py::test_is_bytestring_true[rb''1] tests/pyupgrade_test.py::test_is_bytestring_false[] tests/pyupgrade_test.py::test_is_bytestring_false[""] tests/pyupgrade_test.py::test_is_bytestring_false[''] tests/pyupgrade_test.py::test_is_bytestring_false[u""] tests/pyupgrade_test.py::test_is_bytestring_false["b"] tests/pyupgrade_test.py::test_parse_percent_format[""-expected0] tests/pyupgrade_test.py::test_parse_percent_format["%%"-expected1] tests/pyupgrade_test.py::test_parse_percent_format["%s"-expected2] tests/pyupgrade_test.py::test_parse_percent_format["%s tests/pyupgrade_test.py::test_parse_percent_format["%(hi)s"-expected4] tests/pyupgrade_test.py::test_parse_percent_format["%()s"-expected5] tests/pyupgrade_test.py::test_parse_percent_format["%#o"-expected6] tests/pyupgrade_test.py::test_parse_percent_format["% tests/pyupgrade_test.py::test_parse_percent_format["%5d"-expected8] tests/pyupgrade_test.py::test_parse_percent_format["%*d"-expected9] tests/pyupgrade_test.py::test_parse_percent_format["%.f"-expected10] tests/pyupgrade_test.py::test_parse_percent_format["%.5f"-expected11] tests/pyupgrade_test.py::test_parse_percent_format["%.*f"-expected12] tests/pyupgrade_test.py::test_parse_percent_format["%ld"-expected13] tests/pyupgrade_test.py::test_parse_percent_format["%(complete)#4.4f"-expected14] tests/pyupgrade_test.py::test_percent_to_format[%s-{}] tests/pyupgrade_test.py::test_percent_to_format[%%%s-%{}] tests/pyupgrade_test.py::test_percent_to_format[%(foo)s-{foo}] tests/pyupgrade_test.py::test_percent_to_format[%2f-{:2f}] tests/pyupgrade_test.py::test_percent_to_format[%r-{!r}] tests/pyupgrade_test.py::test_percent_to_format[%a-{!a}] tests/pyupgrade_test.py::test_simplify_conversion_flag[-] tests/pyupgrade_test.py::test_simplify_conversion_flag[ tests/pyupgrade_test.py::test_simplify_conversion_flag[#0- tests/pyupgrade_test.py::test_simplify_conversion_flag[--<] tests/pyupgrade_test.py::test_percent_format_noop["%s" tests/pyupgrade_test.py::test_percent_format_noop[b"%s" tests/pyupgrade_test.py::test_percent_format_noop["%*s" tests/pyupgrade_test.py::test_percent_format_noop["%.*s" tests/pyupgrade_test.py::test_percent_format_noop["%d" tests/pyupgrade_test.py::test_percent_format_noop["%i" tests/pyupgrade_test.py::test_percent_format_noop["%u" tests/pyupgrade_test.py::test_percent_format_noop["%c" tests/pyupgrade_test.py::test_percent_format_noop["%#o" tests/pyupgrade_test.py::test_percent_format_noop["%()s" tests/pyupgrade_test.py::test_percent_format_noop["%4%" tests/pyupgrade_test.py::test_percent_format_noop["%.2r" tests/pyupgrade_test.py::test_percent_format_noop["%.2a" tests/pyupgrade_test.py::test_percent_format_noop[i tests/pyupgrade_test.py::test_percent_format_noop["%(1)s" tests/pyupgrade_test.py::test_percent_format_noop["%(a)s" tests/pyupgrade_test.py::test_percent_format_noop["%(ab)s" tests/pyupgrade_test.py::test_percent_format_noop["%(and)s" tests/pyupgrade_test.py::test_percent_format["trivial" tests/pyupgrade_test.py::test_percent_format["%s" tests/pyupgrade_test.py::test_percent_format["%s%% tests/pyupgrade_test.py::test_percent_format["%3f" tests/pyupgrade_test.py::test_percent_format["%-5s" tests/pyupgrade_test.py::test_percent_format["%9s" tests/pyupgrade_test.py::test_percent_format["brace tests/pyupgrade_test.py::test_percent_format["%(k)s" tests/pyupgrade_test.py::test_percent_format["%(to_list)s" tests/pyupgrade_test.py::test_fix_super_noop[x(] tests/pyupgrade_test.py::test_fix_super_noop[class tests/pyupgrade_test.py::test_fix_super_noop[def tests/pyupgrade_test.py::test_fix_super[class tests/pyupgrade_test.py::test_fix_classes_noop[x tests/pyupgrade_test.py::test_fix_classes_noop[class tests/pyupgrade_test.py::test_fix_classes[class tests/pyupgrade_test.py::test_fix_classes[import tests/pyupgrade_test.py::test_fix_classes[from tests/pyupgrade_test.py::test_fix_six_noop[x tests/pyupgrade_test.py::test_fix_six_noop[isinstance(s, tests/pyupgrade_test.py::test_fix_six_noop[@ tests/pyupgrade_test.py::test_fix_six_noop[from tests/pyupgrade_test.py::test_fix_six_noop[@mydec\nclass tests/pyupgrade_test.py::test_fix_six_noop[six.u tests/pyupgrade_test.py::test_fix_six_noop[six.raise_from tests/pyupgrade_test.py::test_fix_six_noop[print(six.raise_from(exc, tests/pyupgrade_test.py::test_fix_six_noop[print(six.b("\xa3"))] tests/pyupgrade_test.py::test_fix_six_noop[print(six.b( tests/pyupgrade_test.py::test_fix_six[isinstance(s, tests/pyupgrade_test.py::test_fix_six[from tests/pyupgrade_test.py::test_fix_six[issubclass(tp, tests/pyupgrade_test.py::test_fix_six[STRING_TYPES tests/pyupgrade_test.py::test_fix_six[@six.python_2_unicode_compatible\nclass tests/pyupgrade_test.py::test_fix_six[@six.python_2_unicode_compatible\n@other_decorator\nclass tests/pyupgrade_test.py::test_fix_six[six.get_unbound_method(meth)\n-meth\n] tests/pyupgrade_test.py::test_fix_six[six.indexbytes(bs, tests/pyupgrade_test.py::test_fix_six[six.assertCountEqual(\n tests/pyupgrade_test.py::test_fix_six[six.raise_from(exc, tests/pyupgrade_test.py::test_fix_six[six.reraise(tp, tests/pyupgrade_test.py::test_fix_six[six.reraise(\n tests/pyupgrade_test.py::test_fix_classes_py3only[class tests/pyupgrade_test.py::test_fix_classes_py3only[from tests/pyupgrade_test.py::test_fix_fstrings_noop[(] tests/pyupgrade_test.py::test_fix_fstrings_noop["{}" tests/pyupgrade_test.py::test_fix_fstrings_noop["{}".format(\n tests/pyupgrade_test.py::test_fix_fstrings_noop["{} tests/pyupgrade_test.py::test_fix_fstrings_noop["{foo} tests/pyupgrade_test.py::test_fix_fstrings_noop["{0} tests/pyupgrade_test.py::test_fix_fstrings_noop["{x} tests/pyupgrade_test.py::test_fix_fstrings_noop["{x.y} tests/pyupgrade_test.py::test_fix_fstrings_noop[b"{} tests/pyupgrade_test.py::test_fix_fstrings_noop["{:{}}".format(x, tests/pyupgrade_test.py::test_fix_fstrings["{} tests/pyupgrade_test.py::test_fix_fstrings["{1} tests/pyupgrade_test.py::test_fix_fstrings["{x.y}".format(x=z)-f"{z.y}"] tests/pyupgrade_test.py::test_fix_fstrings["{.x} tests/pyupgrade_test.py::test_fix_fstrings["hello tests/pyupgrade_test.py::test_fix_fstrings["{}{{}}{}".format(escaped, tests/pyupgrade_test.py::test_main_trivial tests/pyupgrade_test.py::test_main_noop tests/pyupgrade_test.py::test_main_changes_a_file tests/pyupgrade_test.py::test_main_keeps_line_endings tests/pyupgrade_test.py::test_main_syntax_error tests/pyupgrade_test.py::test_main_non_utf8_bytes tests/pyupgrade_test.py::test_keep_percent_format tests/pyupgrade_test.py::test_py3_plus_argument_unicode_literals tests/pyupgrade_test.py::test_py3_plus_super tests/pyupgrade_test.py::test_py3_plus_new_style_classes tests/pyupgrade_test.py::test_py36_plus_fstrings