-2

If you have to escape curly brackets in f-strings you can double them, so {{hello}} results in {hello}. The problem is, that the algorithm just concatenates the string and afterwards interprets this part as every other part. So if there is any structure inside this string, that triggers some f-string behaviour it fails.

For example, if you want to insert a string with a RegExp like this

_date = f'''
SELECT 
    acol,
    substring(full_date , '[0-9]{{4}}')         
FROM 
    dates 
'''

it results in the desired result. The f-string is instantly converted, so the pattern changes to

substring(full_date , '[0-9]{4}') 

as needed for the SQL query.

But this string as input of

_date.format(acol=acol)

to insert the acol variable, fails with:

IndexError: Replacement index 4 out of range for positional args tuple

Because the {4} is always interpreted as index for a replacement. And it does not matter in which way the {4} is inserted. Because this makes no difference for the format algorithm.

Is there any solution, for instance prevent the format algorithm from interpreting this string part?

1 Answers1

0

Unless there are more constraints you haven't mentioned, this just doesn't have to be an f-string at all:

_date = '''
SELECT 
    {acol},
    substring(full_date , '[0-9]{{4}}')         
FROM 
    dates 
'''

formatted = _date.format(acol="some_col")

print(formatted)

prints


SELECT 
    some_col,
    substring(full_date , '[0-9]{4}')         
FROM 
    dates 
isaactfa
  • 5,461
  • 1
  • 10
  • 24
  • You are right. First I mixed f-string and the str.format() and second I called the _date.format() twice. The first call works as in your example but the second for the result of the first run fails logically. So thank you for figuring this out. – Nils Pitapatting Aug 10 '22 at 13:04