Spaces:
Running
Running
# Copyright 2008 Armin Ronacher. | |
# Licensed to PSF under a Contributor Agreement. | |
"""Fixer that cleans up a tuple argument to isinstance after the tokens | |
in it were fixed. This is mainly used to remove double occurrences of | |
tokens as a leftover of the long -> int / unicode -> str conversion. | |
eg. isinstance(x, (int, long)) -> isinstance(x, (int, int)) | |
-> isinstance(x, int) | |
""" | |
from .. import fixer_base | |
from ..fixer_util import token | |
class FixIsinstance(fixer_base.BaseFix): | |
BM_compatible = True | |
PATTERN = """ | |
power< | |
'isinstance' | |
trailer< '(' arglist< any ',' atom< '(' | |
args=testlist_gexp< any+ > | |
')' > > ')' > | |
> | |
""" | |
run_order = 6 | |
def transform(self, node, results): | |
names_inserted = set() | |
testlist = results["args"] | |
args = testlist.children | |
new_args = [] | |
iterator = enumerate(args) | |
for idx, arg in iterator: | |
if arg.type == token.NAME and arg.value in names_inserted: | |
if idx < len(args) - 1 and args[idx + 1].type == token.COMMA: | |
next(iterator) | |
continue | |
else: | |
new_args.append(arg) | |
if arg.type == token.NAME: | |
names_inserted.add(arg.value) | |
if new_args and new_args[-1].type == token.COMMA: | |
del new_args[-1] | |
if len(new_args) == 1: | |
atom = testlist.parent | |
new_args[0].prefix = atom.prefix | |
atom.replace(new_args[0]) | |
else: | |
args[:] = new_args | |
node.changed() | |