def n_formatted_value2(node): p = self.prec self.prec = 100 expr = node[0] assert expr == "expr" old_in_format_string = self.in_format_string self.in_format_string = "formatted_value2" value = self.traverse(expr, indent="") format_value_attr = node[-1] assert format_value_attr == "FORMAT_VALUE_ATTR" attr = format_value_attr.attr if attr & 4: assert node[1] == "expr" fmt = strip_quotes(self.traverse(node[1], indent="")) attr_flags = attr & 3 if attr_flags: conversion = "%s:%s" % (FSTRING_CONVERSION_MAP.get( attr_flags, ""), fmt) else: conversion = ":%s" % fmt else: conversion = FSTRING_CONVERSION_MAP.get(attr, "") self.in_format_string = old_in_format_string f_str = "f%s" % escape_string("{%s%s}" % (value, conversion)) self.write(f_str) self.prec = p self.prune()
def n_joined_str(node): p = self.prec self.prec = 100 result = '' for expr in node[:-1]: assert expr == 'expr' value = self.traverse(expr, indent='') if expr[0].kind.startswith('formatted_value'): # remove leading 'f' assert value.startswith('f') value = value[1:] pass else: # {{ and }} in Python source-code format strings mean # { and } respectively. But only when *not* part of a # formatted value. However in the LOAD_CONST # bytecode, the escaping of the braces has been # removed. So we need to put back the braces escaping in # reconstructing the source. assert expr[0] == 'LOAD_CONST' value = value.replace("{", "{{").replace("}", "}}") # Remove leading quotes result += strip_quotes(value) pass self.write('f%s' % escape_string(result)) self.prec = p self.prune()
def n_formatted_value1(node): expr = node[0] assert expr == 'expr' value = self.traverse(expr, indent='') conversion = f_conversion(node) f_str = "f%s" % escape_string("{%s%s}" % (value, conversion)) self.write(f_str) self.prune()
def n_formatted_value(node): if node[0] == 'LOAD_CONST': value = node[0].attr if isinstance(value, tuple): self.write(node[0].attr) else: self.write(escape_string(node[0].attr)) self.prune() else: self.default(node)
def n_formatted_value1(node): expr = node[0] assert expr == "expr" conversion = f_conversion(node) if self.in_format_string and self.in_format_string != "formatted_value1": value = self.traverse(expr, indent="") if value[0] == "{": # If we have a set or dictionary comprehension, then we need to add a space # so as not to confuse the format string with {{. fmt = "{ %s%s }" else: fmt = "{%s%s}" es = escape_string(fmt % (value, conversion)) f_str = "%s" % es else: old_in_format_string = self.in_format_string self.in_format_string = "formatted_value1" value = self.traverse(expr, indent="") self.in_format_string = old_in_format_string es = escape_string("{%s%s}" % (value, conversion)) f_str = "f%s" % es self.write(f_str) self.prune()
def n_formatted_value2(node): p = self.prec self.prec = 100 expr = node[0] assert expr == 'expr' value = self.traverse(expr, indent='') format_value_attr = node[-1] assert format_value_attr == 'FORMAT_VALUE_ATTR' attr = format_value_attr.attr if attr == 4: assert node[1] == 'expr' fmt = strip_quotes(self.traverse(node[1], indent='')) conversion = ":%s" % fmt else: conversion = FSTRING_CONVERSION_MAP.get(attr, '') f_str = "f%s" % escape_string("{%s%s}" % (value, conversion)) self.write(f_str) self.prec = p self.prune()
def n_joined_str(node): p = self.prec self.prec = 100 old_in_format_string = self.in_format_string self.in_format_string = "joined_str" result = "" for expr in node[:-1]: assert expr == "expr" value = self.traverse(expr, indent="") if expr[0].kind.startswith("formatted_value"): # remove leading 'f' if value.startswith("f"): value = value[1:] pass else: # {{ and }} in Python source-code format strings mean # { and } respectively. But only when *not* part of a # formatted value. However in the LOAD_STR # bytecode, the escaping of the braces has been # removed. So we need to put back the braces escaping in # reconstructing the source. assert expr[0] == "LOAD_STR" value = value.replace("{", "{{").replace("}", "}}") # Remove leading quotes result += strip_quotes(value) pass self.in_format_string = old_in_format_string if self.in_format_string: self.write(result) else: self.write("f%s" % escape_string(result)) self.prec = p self.prune()