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()