"""Fixer for the removal of operator functions. This converts the following: operator.isSequenceType(obj) -> isinstance(obj, collections.Sequence) operator.isMappingType(obj) -> isinstance(obj, collections.Mapping) operator.isNumberType(obj) -> isinstance(obj, numbers.Number) operator.repeat(obj, n) -> operator.mul(obj, n) operator.irepeat(obj, n) -> operator.imul(obj, n) """ # Local imports from .. import pytree from .. import fixer_base from ..fixer_util import Call, Name, String, touch_import class FixOperator(fixer_base.BaseFix): PATTERN = """ power< 'operator' trailer< '.' func=any > trailer< '(' obj=any ')' > > """ def transform(self, node, results): repeat2mul = { 'repeat': 'mul', 'irepeat': 'imul' } istype2abc = { 'isSequenceType': ['collections', 'Sequence'], 'isMappingType': ['collections', 'Mapping'], 'isNumberType': ['numbers', 'Number'] } func = results["func"] if func.value in repeat2mul: func.replace(Name(repeat2mul[func.value])) elif func.value in istype2abc: module, abc = istype2abc[func.value] touch_import(None, module, node) obj = results['obj'] args = [obj.clone(), String(', ' + ".".join([module, abc]))] return Call(Name('isinstance'), args, prefix=node.get_prefix())