fix_itertools_imports.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. """ Fixer for imports of itertools.(imap|ifilter|izip|ifilterfalse) """
  2. # Local imports
  3. from lib2to3 import fixer_base
  4. from lib2to3.fixer_util import BlankLine, syms, token
  5. class FixItertoolsImports(fixer_base.BaseFix):
  6. BM_compatible = True
  7. PATTERN = """
  8. import_from< 'from' 'itertools' 'import' imports=any >
  9. """ %(locals())
  10. def transform(self, node, results):
  11. imports = results['imports']
  12. if imports.type == syms.import_as_name or not imports.children:
  13. children = [imports]
  14. else:
  15. children = imports.children
  16. for child in children[::2]:
  17. if child.type == token.NAME:
  18. member = child.value
  19. name_node = child
  20. elif child.type == token.STAR:
  21. # Just leave the import as is.
  22. return
  23. else:
  24. assert child.type == syms.import_as_name
  25. name_node = child.children[0]
  26. member_name = name_node.value
  27. if member_name in ('imap', 'izip', 'ifilter'):
  28. child.value = None
  29. child.remove()
  30. elif member_name in ('ifilterfalse', 'izip_longest'):
  31. node.changed()
  32. name_node.value = ('filterfalse' if member_name[1] == 'f'
  33. else 'zip_longest')
  34. # Make sure the import statement is still sane
  35. children = imports.children[:] or [imports]
  36. remove_comma = True
  37. for child in children:
  38. if remove_comma and child.type == token.COMMA:
  39. child.remove()
  40. else:
  41. remove_comma ^= True
  42. while children and children[-1].type == token.COMMA:
  43. children.pop().remove()
  44. # If there are no imports left, just get rid of the entire statement
  45. if (not (imports.children or getattr(imports, 'value', None)) or
  46. imports.parent is None):
  47. p = node.prefix
  48. node = BlankLine()
  49. node.prefix = p
  50. return node