Skip to content

gh-104683: Modernise Tools/clinic/ using pyupgrade #104684

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 30 additions & 26 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ def is_legal_py_identifier(s: str) -> bool:
def ensure_legal_c_identifier(s: str) -> str:
# for now, just complain if what we're given isn't legal
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
if s in c_keywords:
return s + "_value"
Expand Down Expand Up @@ -991,7 +991,7 @@ def parser_body(prototype, *fields, declarations=''):
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
parser_code = [normalize_snippet("""
if (!_PyArg_CheckPositional("{name}", %s, %d, %s)) {{
Expand Down Expand Up @@ -1435,7 +1435,7 @@ def render_function(self, clinic, f):
first_optional = min(first_optional, i)

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
group = p.group
Expand Down Expand Up @@ -1487,8 +1487,7 @@ def render_function(self, clinic, f):

template_dict['c_basename'] = c_basename

methoddef_name = "{}_METHODDEF".format(c_basename.upper())
template_dict['methoddef_name'] = methoddef_name
template_dict['methoddef_name'] = c_basename.upper() + "_METHODDEF"

template_dict['docstring'] = self.docstring_for_c_string(f)

Expand Down Expand Up @@ -1791,7 +1790,7 @@ def is_stop_line(line):
for field in shlex.split(arguments):
name, equals, value = field.partition('=')
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()

if self.verify:
Expand Down Expand Up @@ -1867,7 +1866,10 @@ def print_block(self, block, *, core_includes=False):
output += '\n'
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("\n")

Expand Down Expand Up @@ -1976,7 +1978,7 @@ def dump(self):
def file_changed(filename: str, new_contents: str) -> bool:
"""Return true if file contents changed (meaning we must update it)"""
try:
with open(filename, 'r', encoding="utf-8") as fp:
with open(filename, encoding="utf-8") as fp:
old_contents = fp.read()
return old_contents != new_contents
except FileNotFoundError:
Expand Down Expand Up @@ -2132,7 +2134,7 @@ def parse(self, input):
dsl_name = block.dsl_name
if dsl_name:
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)
parser = self.parsers[dsl_name]
try:
Expand Down Expand Up @@ -2172,7 +2174,7 @@ def parse(self, input):
"can't make directory {}!".format(
destination.filename, dirname))
if self.verify:
with open(destination.filename, "rt") as f:
with open(destination.filename) as f:
parser_2 = BlockParser(f.read(), language=self.language)
blocks = list(parser_2)
if (len(blocks) != 1) or (blocks[0].input != 'preserve\n'):
Expand Down Expand Up @@ -2239,7 +2241,7 @@ def parse_file(
except KeyError:
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()

# exit quickly if there are no clinic markers in the file
Expand Down Expand Up @@ -2537,9 +2539,9 @@ def get_displayname(self, i):
if i == 0:
return '"argument"'
if not self.is_positional_only():
return '''"argument '{}'"'''.format(self.name)
return f'"argument {self.name!r}"'
else:
return '"argument {}"'.format(i)
return f'"argument {i}"'


class LandMine:
Expand Down Expand Up @@ -2723,7 +2725,8 @@ def __init__(self,
if isinstance(self.default_type, type):
types_str = self.default_type.__name__
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(
self.__class__.__name__, default, name, types_str))
self.default = default
Expand Down Expand Up @@ -3955,7 +3958,7 @@ def set_template_dict(self, template_dict):
' Py_TYPE({0})->tp_new == base_tp->tp_new)'
).format(self.name)

line = '{} &&\n '.format(type_check)
line = f'{type_check} &&\n '
template_dict['self_type_check'] = line

type_object = self.function.cls.type_object
Expand Down Expand Up @@ -4011,10 +4014,12 @@ def declare(self, data):
data.return_value = data.converter_retval

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):
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):
"""
Expand Down Expand Up @@ -4477,13 +4482,13 @@ def state_modulename_name(self, line):
c_basename = c_basename.strip() or None

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):
fail("Illegal C basename: {}".format(c_basename))
fail("Illegal C basename:", c_basename)

return_converter = None
if returns:
ast_input = "def x() -> {}: pass".format(returns)
ast_input = f"def x() -> {returns}: pass"
module = None
try:
module = ast.parse(ast_input)
Expand Down Expand Up @@ -4696,15 +4701,15 @@ def state_parameter(self, line):

module = None
try:
ast_input = "def x({}): pass".format(base)
ast_input = f"def x({base}): pass"
module = ast.parse(ast_input)
except SyntaxError:
try:
# the last = was probably inside a function call, like
# c: int(accept={str})
# so assume there was no actual default value.
default = None
ast_input = "def x({}): pass".format(line)
ast_input = f"def x({line}): pass"
module = ast.parse(ast_input)
except SyntaxError:
pass
Expand Down Expand Up @@ -4748,8 +4753,7 @@ def state_parameter(self, line):
self.parameter_state = self.ps_optional
default = default.strip()
bad = False
ast_input = "x = {}".format(default)
bad = False
ast_input = f"x = {default}"
try:
module = ast.parse(ast_input)

Expand Down Expand Up @@ -4856,7 +4860,7 @@ def bad_node(self, node):
dict = legacy_converters if legacy else converters
legacy_str = "legacy " if legacy else ""
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
# but the parameter object gets the python name
converter = dict[name](c_name or parameter_name, parameter_name, self.function, value, **kwargs)
Expand Down Expand Up @@ -5388,7 +5392,7 @@ def main(argv):
for parameter_name, parameter in signature.parameters.items():
if parameter.kind == inspect.Parameter.KEYWORD_ONLY:
if parameter.default != inspect.Parameter.empty:
s = '{}={!r}'.format(parameter_name, parameter.default)
s = f'{parameter_name}={parameter.default!r}'
else:
s = parameter_name
parameters.append(s)
Expand Down
2 changes: 1 addition & 1 deletion Tools/clinic/cpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def pop_stack() -> TokenAndCondition:

if __name__ == '__main__':
for filename in sys.argv[1:]:
with open(filename, "rt") as f:
with open(filename) as f:
cpp = Monitor(filename, verbose=True)
print()
print(filename)
Expand Down