mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	gh-104683: Modernise Tools/clinic/ (#104684)
- Make some string interpolations more readable using f-strings or explicit parametrisation - Remove unneeded open() mode specifiers Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
This commit is contained in:
		
							parent
							
								
									30488fa22a
								
							
						
					
					
						commit
						19dd5aa89a
					
				
					 2 changed files with 31 additions and 27 deletions
				
			
		| 
						 | 
					@ -208,7 +208,7 @@ typedef typeof union unsigned void volatile while
 | 
				
			||||||
def ensure_legal_c_identifier(s: str) -> str:
 | 
					def ensure_legal_c_identifier(s: str) -> str:
 | 
				
			||||||
    # for now, just complain if what we're given isn't legal
 | 
					    # for now, just complain if what we're given isn't legal
 | 
				
			||||||
    if not is_legal_c_identifier(s):
 | 
					    if not is_legal_c_identifier(s):
 | 
				
			||||||
        fail("Illegal C identifier: {}".format(s))
 | 
					        fail("Illegal C identifier:", s)
 | 
				
			||||||
    # but if we picked a C keyword, pick something else
 | 
					    # but if we picked a C keyword, pick something else
 | 
				
			||||||
    if s in c_keywords:
 | 
					    if s in c_keywords:
 | 
				
			||||||
        return s + "_value"
 | 
					        return s + "_value"
 | 
				
			||||||
| 
						 | 
					@ -991,7 +991,7 @@ class CLanguage(Language):
 | 
				
			||||||
                argname_fmt = 'PyTuple_GET_ITEM(args, %d)'
 | 
					                argname_fmt = 'PyTuple_GET_ITEM(args, %d)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            left_args = "{} - {}".format(nargs, max_pos)
 | 
					            left_args = f"{nargs} - {max_pos}"
 | 
				
			||||||
            max_args = NO_VARARG if (vararg != NO_VARARG) else max_pos
 | 
					            max_args = NO_VARARG if (vararg != NO_VARARG) else max_pos
 | 
				
			||||||
            parser_code = [normalize_snippet("""
 | 
					            parser_code = [normalize_snippet("""
 | 
				
			||||||
                if (!_PyArg_CheckPositional("{name}", %s, %d, %s)) {{
 | 
					                if (!_PyArg_CheckPositional("{name}", %s, %d, %s)) {{
 | 
				
			||||||
| 
						 | 
					@ -1435,7 +1435,7 @@ class CLanguage(Language):
 | 
				
			||||||
                first_optional = min(first_optional, i)
 | 
					                first_optional = min(first_optional, i)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if p.is_vararg():
 | 
					            if p.is_vararg():
 | 
				
			||||||
                data.cleanup.append("Py_XDECREF({});".format(c.parser_name))
 | 
					                data.cleanup.append(f"Py_XDECREF({c.parser_name});")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # insert group variable
 | 
					            # insert group variable
 | 
				
			||||||
            group = p.group
 | 
					            group = p.group
 | 
				
			||||||
| 
						 | 
					@ -1487,8 +1487,7 @@ class CLanguage(Language):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        template_dict['c_basename'] = c_basename
 | 
					        template_dict['c_basename'] = c_basename
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        methoddef_name = "{}_METHODDEF".format(c_basename.upper())
 | 
					        template_dict['methoddef_name'] = c_basename.upper() + "_METHODDEF"
 | 
				
			||||||
        template_dict['methoddef_name'] = methoddef_name
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        template_dict['docstring'] = self.docstring_for_c_string(f)
 | 
					        template_dict['docstring'] = self.docstring_for_c_string(f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1791,7 +1790,7 @@ class BlockParser:
 | 
				
			||||||
            for field in shlex.split(arguments):
 | 
					            for field in shlex.split(arguments):
 | 
				
			||||||
                name, equals, value = field.partition('=')
 | 
					                name, equals, value = field.partition('=')
 | 
				
			||||||
                if not equals:
 | 
					                if not equals:
 | 
				
			||||||
                    fail("Mangled Argument Clinic marker line: {!r}".format(line))
 | 
					                    fail("Mangled Argument Clinic marker line:", repr(line))
 | 
				
			||||||
                d[name.strip()] = value.strip()
 | 
					                d[name.strip()] = value.strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if self.verify:
 | 
					            if self.verify:
 | 
				
			||||||
| 
						 | 
					@ -1867,7 +1866,10 @@ class BlockPrinter:
 | 
				
			||||||
                output += '\n'
 | 
					                output += '\n'
 | 
				
			||||||
            write(output)
 | 
					            write(output)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arguments="output={} input={}".format(compute_checksum(output, 16), compute_checksum(input, 16))
 | 
					        arguments = "output={output} input={input}".format(
 | 
				
			||||||
 | 
					            output=compute_checksum(output, 16),
 | 
				
			||||||
 | 
					            input=compute_checksum(input, 16)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        write(self.language.checksum_line.format(dsl_name=dsl_name, arguments=arguments))
 | 
					        write(self.language.checksum_line.format(dsl_name=dsl_name, arguments=arguments))
 | 
				
			||||||
        write("\n")
 | 
					        write("\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1976,7 +1978,7 @@ return_converters = {}
 | 
				
			||||||
def file_changed(filename: str, new_contents: str) -> bool:
 | 
					def file_changed(filename: str, new_contents: str) -> bool:
 | 
				
			||||||
    """Return true if file contents changed (meaning we must update it)"""
 | 
					    """Return true if file contents changed (meaning we must update it)"""
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        with open(filename, 'r', encoding="utf-8") as fp:
 | 
					        with open(filename, encoding="utf-8") as fp:
 | 
				
			||||||
            old_contents = fp.read()
 | 
					            old_contents = fp.read()
 | 
				
			||||||
        return old_contents != new_contents
 | 
					        return old_contents != new_contents
 | 
				
			||||||
    except FileNotFoundError:
 | 
					    except FileNotFoundError:
 | 
				
			||||||
| 
						 | 
					@ -2132,7 +2134,7 @@ impl_definition block
 | 
				
			||||||
            dsl_name = block.dsl_name
 | 
					            dsl_name = block.dsl_name
 | 
				
			||||||
            if dsl_name:
 | 
					            if dsl_name:
 | 
				
			||||||
                if dsl_name not in self.parsers:
 | 
					                if dsl_name not in self.parsers:
 | 
				
			||||||
                    assert dsl_name in parsers, "No parser to handle {!r} block.".format(dsl_name)
 | 
					                    assert dsl_name in parsers, f"No parser to handle {dsl_name!r} block."
 | 
				
			||||||
                    self.parsers[dsl_name] = parsers[dsl_name](self)
 | 
					                    self.parsers[dsl_name] = parsers[dsl_name](self)
 | 
				
			||||||
                parser = self.parsers[dsl_name]
 | 
					                parser = self.parsers[dsl_name]
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
| 
						 | 
					@ -2172,7 +2174,7 @@ impl_definition block
 | 
				
			||||||
                                     "can't make directory {}!".format(
 | 
					                                     "can't make directory {}!".format(
 | 
				
			||||||
                                        destination.filename, dirname))
 | 
					                                        destination.filename, dirname))
 | 
				
			||||||
                        if self.verify:
 | 
					                        if self.verify:
 | 
				
			||||||
                            with open(destination.filename, "rt") as f:
 | 
					                            with open(destination.filename) as f:
 | 
				
			||||||
                                parser_2 = BlockParser(f.read(), language=self.language)
 | 
					                                parser_2 = BlockParser(f.read(), language=self.language)
 | 
				
			||||||
                                blocks = list(parser_2)
 | 
					                                blocks = list(parser_2)
 | 
				
			||||||
                                if (len(blocks) != 1) or (blocks[0].input != 'preserve\n'):
 | 
					                                if (len(blocks) != 1) or (blocks[0].input != 'preserve\n'):
 | 
				
			||||||
| 
						 | 
					@ -2239,7 +2241,7 @@ def parse_file(
 | 
				
			||||||
    except KeyError:
 | 
					    except KeyError:
 | 
				
			||||||
        fail("Can't identify file type for file " + repr(filename))
 | 
					        fail("Can't identify file type for file " + repr(filename))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with open(filename, 'r', encoding="utf-8") as f:
 | 
					    with open(filename, encoding="utf-8") as f:
 | 
				
			||||||
        raw = f.read()
 | 
					        raw = f.read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # exit quickly if there are no clinic markers in the file
 | 
					    # exit quickly if there are no clinic markers in the file
 | 
				
			||||||
| 
						 | 
					@ -2537,9 +2539,9 @@ class Parameter:
 | 
				
			||||||
        if i == 0:
 | 
					        if i == 0:
 | 
				
			||||||
            return '"argument"'
 | 
					            return '"argument"'
 | 
				
			||||||
        if not self.is_positional_only():
 | 
					        if not self.is_positional_only():
 | 
				
			||||||
            return '''"argument '{}'"'''.format(self.name)
 | 
					            return f'"argument {self.name!r}"'
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return '"argument {}"'.format(i)
 | 
					            return f'"argument {i}"'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LandMine:
 | 
					class LandMine:
 | 
				
			||||||
| 
						 | 
					@ -2723,7 +2725,8 @@ class CConverter(metaclass=CConverterAutoRegister):
 | 
				
			||||||
                if isinstance(self.default_type, type):
 | 
					                if isinstance(self.default_type, type):
 | 
				
			||||||
                    types_str = self.default_type.__name__
 | 
					                    types_str = self.default_type.__name__
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    types_str = ', '.join((cls.__name__ for cls in self.default_type))
 | 
					                    names = [cls.__name__ for cls in self.default_type]
 | 
				
			||||||
 | 
					                    types_str = ', '.join(names)
 | 
				
			||||||
                fail("{}: default value {!r} for field {} is not of type {}".format(
 | 
					                fail("{}: default value {!r} for field {} is not of type {}".format(
 | 
				
			||||||
                    self.__class__.__name__, default, name, types_str))
 | 
					                    self.__class__.__name__, default, name, types_str))
 | 
				
			||||||
            self.default = default
 | 
					            self.default = default
 | 
				
			||||||
| 
						 | 
					@ -3955,7 +3958,7 @@ class self_converter(CConverter):
 | 
				
			||||||
                              ' Py_TYPE({0})->tp_new == base_tp->tp_new)'
 | 
					                              ' Py_TYPE({0})->tp_new == base_tp->tp_new)'
 | 
				
			||||||
                             ).format(self.name)
 | 
					                             ).format(self.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            line = '{} &&\n        '.format(type_check)
 | 
					            line = f'{type_check} &&\n        '
 | 
				
			||||||
            template_dict['self_type_check'] = line
 | 
					            template_dict['self_type_check'] = line
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            type_object = self.function.cls.type_object
 | 
					            type_object = self.function.cls.type_object
 | 
				
			||||||
| 
						 | 
					@ -4011,10 +4014,12 @@ class CReturnConverter(metaclass=CReturnConverterAutoRegister):
 | 
				
			||||||
        data.return_value = data.converter_retval
 | 
					        data.return_value = data.converter_retval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def err_occurred_if(self, expr, data):
 | 
					    def err_occurred_if(self, expr, data):
 | 
				
			||||||
        data.return_conversion.append('if (({}) && PyErr_Occurred()) {{\n    goto exit;\n}}\n'.format(expr))
 | 
					        line = f'if (({expr}) && PyErr_Occurred()) {{\n    goto exit;\n}}\n'
 | 
				
			||||||
 | 
					        data.return_conversion.append(line)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def err_occurred_if_null_pointer(self, variable, data):
 | 
					    def err_occurred_if_null_pointer(self, variable, data):
 | 
				
			||||||
        data.return_conversion.append('if ({} == NULL) {{\n    goto exit;\n}}\n'.format(variable))
 | 
					        line = f'if ({variable} == NULL) {{\n    goto exit;\n}}\n'
 | 
				
			||||||
 | 
					        data.return_conversion.append(line)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def render(self, function, data):
 | 
					    def render(self, function, data):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
| 
						 | 
					@ -4477,13 +4482,13 @@ class DSLParser:
 | 
				
			||||||
        c_basename = c_basename.strip() or None
 | 
					        c_basename = c_basename.strip() or None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not is_legal_py_identifier(full_name):
 | 
					        if not is_legal_py_identifier(full_name):
 | 
				
			||||||
            fail("Illegal function name: {}".format(full_name))
 | 
					            fail("Illegal function name:", full_name)
 | 
				
			||||||
        if c_basename and not is_legal_c_identifier(c_basename):
 | 
					        if c_basename and not is_legal_c_identifier(c_basename):
 | 
				
			||||||
            fail("Illegal C basename: {}".format(c_basename))
 | 
					            fail("Illegal C basename:", c_basename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return_converter = None
 | 
					        return_converter = None
 | 
				
			||||||
        if returns:
 | 
					        if returns:
 | 
				
			||||||
            ast_input = "def x() -> {}: pass".format(returns)
 | 
					            ast_input = f"def x() -> {returns}: pass"
 | 
				
			||||||
            module = None
 | 
					            module = None
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                module = ast.parse(ast_input)
 | 
					                module = ast.parse(ast_input)
 | 
				
			||||||
| 
						 | 
					@ -4696,7 +4701,7 @@ class DSLParser:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        module = None
 | 
					        module = None
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            ast_input = "def x({}): pass".format(base)
 | 
					            ast_input = f"def x({base}): pass"
 | 
				
			||||||
            module = ast.parse(ast_input)
 | 
					            module = ast.parse(ast_input)
 | 
				
			||||||
        except SyntaxError:
 | 
					        except SyntaxError:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
| 
						 | 
					@ -4704,7 +4709,7 @@ class DSLParser:
 | 
				
			||||||
                #   c: int(accept={str})
 | 
					                #   c: int(accept={str})
 | 
				
			||||||
                # so assume there was no actual default value.
 | 
					                # so assume there was no actual default value.
 | 
				
			||||||
                default = None
 | 
					                default = None
 | 
				
			||||||
                ast_input = "def x({}): pass".format(line)
 | 
					                ast_input = f"def x({line}): pass"
 | 
				
			||||||
                module = ast.parse(ast_input)
 | 
					                module = ast.parse(ast_input)
 | 
				
			||||||
            except SyntaxError:
 | 
					            except SyntaxError:
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
| 
						 | 
					@ -4748,8 +4753,7 @@ class DSLParser:
 | 
				
			||||||
                self.parameter_state = self.ps_optional
 | 
					                self.parameter_state = self.ps_optional
 | 
				
			||||||
            default = default.strip()
 | 
					            default = default.strip()
 | 
				
			||||||
            bad = False
 | 
					            bad = False
 | 
				
			||||||
            ast_input = "x = {}".format(default)
 | 
					            ast_input = f"x = {default}"
 | 
				
			||||||
            bad = False
 | 
					 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                module = ast.parse(ast_input)
 | 
					                module = ast.parse(ast_input)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4856,7 +4860,7 @@ class DSLParser:
 | 
				
			||||||
        dict = legacy_converters if legacy else converters
 | 
					        dict = legacy_converters if legacy else converters
 | 
				
			||||||
        legacy_str = "legacy " if legacy else ""
 | 
					        legacy_str = "legacy " if legacy else ""
 | 
				
			||||||
        if name not in dict:
 | 
					        if name not in dict:
 | 
				
			||||||
            fail('{} is not a valid {}converter'.format(name, legacy_str))
 | 
					            fail(f'{name} is not a valid {legacy_str}converter')
 | 
				
			||||||
        # if you use a c_name for the parameter, we just give that name to the converter
 | 
					        # if you use a c_name for the parameter, we just give that name to the converter
 | 
				
			||||||
        # but the parameter object gets the python name
 | 
					        # but the parameter object gets the python name
 | 
				
			||||||
        converter = dict[name](c_name or parameter_name, parameter_name, self.function, value, **kwargs)
 | 
					        converter = dict[name](c_name or parameter_name, parameter_name, self.function, value, **kwargs)
 | 
				
			||||||
| 
						 | 
					@ -5388,7 +5392,7 @@ For more information see https://docs.python.org/3/howto/clinic.html""")
 | 
				
			||||||
                for parameter_name, parameter in signature.parameters.items():
 | 
					                for parameter_name, parameter in signature.parameters.items():
 | 
				
			||||||
                    if parameter.kind == inspect.Parameter.KEYWORD_ONLY:
 | 
					                    if parameter.kind == inspect.Parameter.KEYWORD_ONLY:
 | 
				
			||||||
                        if parameter.default != inspect.Parameter.empty:
 | 
					                        if parameter.default != inspect.Parameter.empty:
 | 
				
			||||||
                            s = '{}={!r}'.format(parameter_name, parameter.default)
 | 
					                            s = f'{parameter_name}={parameter.default!r}'
 | 
				
			||||||
                        else:
 | 
					                        else:
 | 
				
			||||||
                            s = parameter_name
 | 
					                            s = parameter_name
 | 
				
			||||||
                        parameters.append(s)
 | 
					                        parameters.append(s)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -185,7 +185,7 @@ class Monitor:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    for filename in sys.argv[1:]:
 | 
					    for filename in sys.argv[1:]:
 | 
				
			||||||
        with open(filename, "rt") as f:
 | 
					        with open(filename) as f:
 | 
				
			||||||
            cpp = Monitor(filename, verbose=True)
 | 
					            cpp = Monitor(filename, verbose=True)
 | 
				
			||||||
            print()
 | 
					            print()
 | 
				
			||||||
            print(filename)
 | 
					            print(filename)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue