invalid syntax python

Рейтинг: 0Ответов: 1Опубликовано: 20.07.2023
     print(f"str{kaf.a:a}{kaf.b:c}")
                                  ^
SyntaxError: invalid syntax

что в этом коде не так почему синтаксическую ошибку выдает?

Ответы

▲ 4

Как уже вам написали в комментариях, ошибка возникает из-за того, что вы запускаете код какой-то старой версией Python (более старой, чем Python 3.6), где еще нет синтаксиса f-строк.

По поводу адаптации под старые версии Python:

В целом, такая строка f"{x:y}" аналогична "{:y}".format(x) или format(x, "y") (и это во всех случаях превращается в вызов x.__format__("y")).

Например,

x = 1
print(f"{x:010}")
print("{:010}".format(x))
print(format(x, "010"))
print(x.__format__("010"))

во всех случаях выведет 0000000001 (010 в данном случае означает "добить нулями слева до 10 символов").

Поэтому чисто механически ваш код перевести в стиль format можно, например, так:

print("str{:a}{:c}".format(kaf.a, kaf.b))

и это может работать старых версиях Python, в том числе и на Python 2, при условии что у объектов, записанных в полях kaf.a и kaf.b реализован метод __format__, который будет понимать, что за такое a и с.

Пример такого кода (адаптировано под Python 2):

# -*- coding: utf-8 -*-
from __future__ import print_function


class Field(object):
    def __format__(self, spec):
        # Для примера берем спецификатор форматирования (то что после двоеточия)
        # и переводим в верхний регистр
        return spec.upper()  


class Kaf(object):
    def __init__(self):
        self.a = Field()
        self.b = Field()


kaf = Kaf()

print("str{:a}{:c}".format(kaf.a, kaf.b))

Вывод:

strAC

Смысла именно в таком коде не много, но в принципе для своего класса с помощью переопределения метода __format__ можно реализовать какие-то свои обозначения, что-то похожее на спецификаторы форматирования чисел, например.