""" Migrate QFileDialog methods from PyQt4 to PyQt5 """ # Author: Médéric Ribreux # Adapted from fix_pyqt # and http://python3porting.com/fixers.html # Local imports from lib2to3.fixer_base import BaseFix class FixQfiledialog(BaseFix): PATTERN = """ power< 'QFileDialog' trailer< '.' filter=('getOpenFileNameAndFilter'|'getOpenFileNamesAndFilter'|'getSaveFileNameAndFilter') > any > | expr_stmt< filename=any '=' power< any trailer< '(' power< 'QFileDialog' trailer< '.' method=('getOpenFileName'|'getOpenFileNames'|'getSaveFileName') > any > ')' > > > | expr_stmt< filename=any '=' power< 'QFileDialog' trailer< '.' method=('getOpenFileName'|'getOpenFileNames'|'getSaveFileName') > any > > """ def transform(self, node, results): # First case: getOpen/SaveFileName # We need to add __ variable because in PyQt5 # getOpen/SaveFileName returns a tuple if "filename" in results: node = results["filename"] # count number of leaves (result variables) nbLeaves = sum(1 for i in node.leaves()) # If we have less than two args, # we add __ special variable if nbLeaves < 3: fileName = node.value node.value = f"{fileName}, __" node.changed() # Rename *AndFilter methods if "filter" in results: method = results["filter"][0] method.value = method.value.replace("AndFilter", "") method.changed()