I have this api call.
payload = "{\\"weight\\":{\\"value\\":\\"85.00\\",\\"unit\":\\"kg\\"},\\"height\\":{\\"value\\":\\"170.00\\",\\"unit\\":\\"cm\\"},\\"sex\\":\\"m\\",\\"age\\":\\"24\\",\\"waist\\":\\"34.00\\",\\"hip\\":\\"40.00\\"}"
I want to use a f string to change those values but I get a syntax error saying I can't use backslash for f strings. What can I do?
We can use any quotation marks {single or double or triple} in the f-string. We have to use the escape character to print quotation marks. The f-string expression doesn't allow us to use the backslash. We have to place it outside the { }.
In short, to match a literal backslash, one has to write '\\\\' as the RE string, because the regular expression must be "\\", and each backslash must be expressed as "\\" inside a regular Python string literal.
Strings in Python are usually enclosed within double quotes ( "" ) or single quotes ( '' ). To create f-strings, you only need to add an f or an F before the opening quotes of your string. For example, "This" is a string whereas f"This" is an f-String.
“F-strings provide a way to embed expressions inside string literals, using a minimal syntax. It should be noted that an f-string is really an expression evaluated at run time, not a constant value. In Python source code, an f-string is a literal string, prefixed with f , which contains expressions inside braces.
This is currently a limitation of f-strings in python. Backslashes aren't allowed in them at all (see https://mail.python.org/pipermail/python-dev/2016-August/145979.html)
Option 1
The best way would be to instead use use str.format()
to accomplish this, per https://docs.python.org/3/library/stdtypes.html#str.format
Option 2
If you're super keen on using backslashes, you could do something like this:
backslash_char = "\\"
my_string = f"{backslash_char}foo{bar}"
But that's probably not the best way to make your code readable to other people.
Option 3
If you're absolutely certain you'll never use a particular character, you could also put in that character as a placeholder, something like
my_string = f"🍔foo{bar}".replace("🍔", "\\")
But that's also super workaround-y. And it's a great way to introduce bugs down the road, if you ever get an input with that char in it.
Option 4
As mentioned in the comments to this answer, another option would be to do chr(92)
inside some curlies, as below:
my_string = f"This is a backslash: {chr(92)}"
class data(object):
_weight = 85.00
_height = 170.00
_sex = 'm'
_age = '24'
_waist = 34.0
_hip = 40.0
payload = f'\
{{\
"weight": {{\
"value": "{data._weight}",\
"unit": "kg"\
}},\
"height": {{\
"value": "{data._height}",\
"unit": "cm"\
}},\
"sex": "{data._sex}",\
"age": "{data._age}",\
"waist": "{data._waist}",\
"hip": "{data._hip}"\
}}'
print(payload)
Result:
C:\>python.exe test.py { "weight": { "value": "85.00", "unit": "kg" }, "height": { "value": "170.00", "unit": "cm" }, "sex": "m", "age": "24", "waist": "34.0", "hip": "40.0" }
Result via 'jq': (check here for info on 'jq')
C:\>python.exe test.py | jq . { "weight": { "value": "85.00", "unit": "kg" }, "height": { "value": "170.00", "unit": "cm" }, "sex": "m", "age": "24", "waist": "34.0", "hip": "40.0" }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With