(root)/
Python-3.12.0/
Lib/
lib2to3/
fixes/
fix_isinstance.py
       1  # Copyright 2008 Armin Ronacher.
       2  # Licensed to PSF under a Contributor Agreement.
       3  
       4  """Fixer that cleans up a tuple argument to isinstance after the tokens
       5  in it were fixed.  This is mainly used to remove double occurrences of
       6  tokens as a leftover of the long -> int / unicode -> str conversion.
       7  
       8  eg.  isinstance(x, (int, long)) -> isinstance(x, (int, int))
       9         -> isinstance(x, int)
      10  """
      11  
      12  from .. import fixer_base
      13  from ..fixer_util import token
      14  
      15  
      16  class ESC[4;38;5;81mFixIsinstance(ESC[4;38;5;149mfixer_baseESC[4;38;5;149m.ESC[4;38;5;149mBaseFix):
      17      BM_compatible = True
      18      PATTERN = """
      19      power<
      20          'isinstance'
      21          trailer< '(' arglist< any ',' atom< '('
      22              args=testlist_gexp< any+ >
      23          ')' > > ')' >
      24      >
      25      """
      26  
      27      run_order = 6
      28  
      29      def transform(self, node, results):
      30          names_inserted = set()
      31          testlist = results["args"]
      32          args = testlist.children
      33          new_args = []
      34          iterator = enumerate(args)
      35          for idx, arg in iterator:
      36              if arg.type == token.NAME and arg.value in names_inserted:
      37                  if idx < len(args) - 1 and args[idx + 1].type == token.COMMA:
      38                      next(iterator)
      39                      continue
      40              else:
      41                  new_args.append(arg)
      42                  if arg.type == token.NAME:
      43                      names_inserted.add(arg.value)
      44          if new_args and new_args[-1].type == token.COMMA:
      45              del new_args[-1]
      46          if len(new_args) == 1:
      47              atom = testlist.parent
      48              new_args[0].prefix = atom.prefix
      49              atom.replace(new_args[0])
      50          else:
      51              args[:] = new_args
      52              node.changed()