Why don't f-strings play nicely with dictionaries?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
f-strings don't behave nicely when used with dictionaries, as mentioned here.
Here is an example of the not-so-nice behavior:
d = {'foo': 'bar'}
# Both work as expected
d["foo"]
d['foo']
# This only works when different quotations are used in the inner and outer strings
f'{d["foo"]}'
f"{d['foo']}"
# This doesn't work
f'{d['foo']}'
f"{d["foo"]}"
# The .format() method doesn't care
'{}'.format(d['foo'])
The last two f-strings listed result in a SyntaxError: invalid syntax
, which happens because the string '{d['foo']}'
is evaluated as '{d['
foo']}'
.
What is the underlying reason everything inside the curly brackets of f-strings doesn't get evaluated separately, as when using the old .format()
method, and what could possibly be the reason for implementing f-strings in this way?
I love f-strings, but this seems like a point in favor of the old method.
python string python-3.x syntax-error
add a comment |
f-strings don't behave nicely when used with dictionaries, as mentioned here.
Here is an example of the not-so-nice behavior:
d = {'foo': 'bar'}
# Both work as expected
d["foo"]
d['foo']
# This only works when different quotations are used in the inner and outer strings
f'{d["foo"]}'
f"{d['foo']}"
# This doesn't work
f'{d['foo']}'
f"{d["foo"]}"
# The .format() method doesn't care
'{}'.format(d['foo'])
The last two f-strings listed result in a SyntaxError: invalid syntax
, which happens because the string '{d['foo']}'
is evaluated as '{d['
foo']}'
.
What is the underlying reason everything inside the curly brackets of f-strings doesn't get evaluated separately, as when using the old .format()
method, and what could possibly be the reason for implementing f-strings in this way?
I love f-strings, but this seems like a point in favor of the old method.
python string python-3.x syntax-error
1
How would you mark the end of the string if'
didn't mean'
?
– Peter Wood
Nov 23 '18 at 15:34
See answer here stackoverflow.com/questions/4630465/…
– yoonghm
Nov 23 '18 at 15:36
add a comment |
f-strings don't behave nicely when used with dictionaries, as mentioned here.
Here is an example of the not-so-nice behavior:
d = {'foo': 'bar'}
# Both work as expected
d["foo"]
d['foo']
# This only works when different quotations are used in the inner and outer strings
f'{d["foo"]}'
f"{d['foo']}"
# This doesn't work
f'{d['foo']}'
f"{d["foo"]}"
# The .format() method doesn't care
'{}'.format(d['foo'])
The last two f-strings listed result in a SyntaxError: invalid syntax
, which happens because the string '{d['foo']}'
is evaluated as '{d['
foo']}'
.
What is the underlying reason everything inside the curly brackets of f-strings doesn't get evaluated separately, as when using the old .format()
method, and what could possibly be the reason for implementing f-strings in this way?
I love f-strings, but this seems like a point in favor of the old method.
python string python-3.x syntax-error
f-strings don't behave nicely when used with dictionaries, as mentioned here.
Here is an example of the not-so-nice behavior:
d = {'foo': 'bar'}
# Both work as expected
d["foo"]
d['foo']
# This only works when different quotations are used in the inner and outer strings
f'{d["foo"]}'
f"{d['foo']}"
# This doesn't work
f'{d['foo']}'
f"{d["foo"]}"
# The .format() method doesn't care
'{}'.format(d['foo'])
The last two f-strings listed result in a SyntaxError: invalid syntax
, which happens because the string '{d['foo']}'
is evaluated as '{d['
foo']}'
.
What is the underlying reason everything inside the curly brackets of f-strings doesn't get evaluated separately, as when using the old .format()
method, and what could possibly be the reason for implementing f-strings in this way?
I love f-strings, but this seems like a point in favor of the old method.
python string python-3.x syntax-error
python string python-3.x syntax-error
asked Nov 23 '18 at 15:26
OfficialThrowawayOfficialThrowaway
193
193
1
How would you mark the end of the string if'
didn't mean'
?
– Peter Wood
Nov 23 '18 at 15:34
See answer here stackoverflow.com/questions/4630465/…
– yoonghm
Nov 23 '18 at 15:36
add a comment |
1
How would you mark the end of the string if'
didn't mean'
?
– Peter Wood
Nov 23 '18 at 15:34
See answer here stackoverflow.com/questions/4630465/…
– yoonghm
Nov 23 '18 at 15:36
1
1
How would you mark the end of the string if
'
didn't mean '
?– Peter Wood
Nov 23 '18 at 15:34
How would you mark the end of the string if
'
didn't mean '
?– Peter Wood
Nov 23 '18 at 15:34
See answer here stackoverflow.com/questions/4630465/…
– yoonghm
Nov 23 '18 at 15:36
See answer here stackoverflow.com/questions/4630465/…
– yoonghm
Nov 23 '18 at 15:36
add a comment |
2 Answers
2
active
oldest
votes
One traditional way of including quotes within quotes is to use a backslash. But PEP498 forbids backslashes in expressions within f-strings:
Backslashes may not appear inside the expression portions of
f-strings...You can use a different type of quote inside the expression...
Therefore, the only way left to access a dictionary value given a key in an f-string expression is to use a different type quote. Using single quotes, or double quotes, everywhere is ambiguous and gives SyntaxError
.
str.format
is a regular method, and as such works differently: d['foo']
is evaluated before the string is constructed. Just like when you feed arguments to a function, the arguments are evaluated before the function does anything.
add a comment |
This has nothing to do with f
-strings. f
strings are common strings once evaluated. What you are trying would be a problem with standard strings too
The problem is that
'a "b" c'
is declares the literal a "b" c
while
'a 'b' c'
the quotes close and reopen. So, it is equivalent to string a
, followed by variable b
, followed by string c
.
That's the whole reason python supports both types of quotation marks
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53449308%2fwhy-dont-f-strings-play-nicely-with-dictionaries%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
One traditional way of including quotes within quotes is to use a backslash. But PEP498 forbids backslashes in expressions within f-strings:
Backslashes may not appear inside the expression portions of
f-strings...You can use a different type of quote inside the expression...
Therefore, the only way left to access a dictionary value given a key in an f-string expression is to use a different type quote. Using single quotes, or double quotes, everywhere is ambiguous and gives SyntaxError
.
str.format
is a regular method, and as such works differently: d['foo']
is evaluated before the string is constructed. Just like when you feed arguments to a function, the arguments are evaluated before the function does anything.
add a comment |
One traditional way of including quotes within quotes is to use a backslash. But PEP498 forbids backslashes in expressions within f-strings:
Backslashes may not appear inside the expression portions of
f-strings...You can use a different type of quote inside the expression...
Therefore, the only way left to access a dictionary value given a key in an f-string expression is to use a different type quote. Using single quotes, or double quotes, everywhere is ambiguous and gives SyntaxError
.
str.format
is a regular method, and as such works differently: d['foo']
is evaluated before the string is constructed. Just like when you feed arguments to a function, the arguments are evaluated before the function does anything.
add a comment |
One traditional way of including quotes within quotes is to use a backslash. But PEP498 forbids backslashes in expressions within f-strings:
Backslashes may not appear inside the expression portions of
f-strings...You can use a different type of quote inside the expression...
Therefore, the only way left to access a dictionary value given a key in an f-string expression is to use a different type quote. Using single quotes, or double quotes, everywhere is ambiguous and gives SyntaxError
.
str.format
is a regular method, and as such works differently: d['foo']
is evaluated before the string is constructed. Just like when you feed arguments to a function, the arguments are evaluated before the function does anything.
One traditional way of including quotes within quotes is to use a backslash. But PEP498 forbids backslashes in expressions within f-strings:
Backslashes may not appear inside the expression portions of
f-strings...You can use a different type of quote inside the expression...
Therefore, the only way left to access a dictionary value given a key in an f-string expression is to use a different type quote. Using single quotes, or double quotes, everywhere is ambiguous and gives SyntaxError
.
str.format
is a regular method, and as such works differently: d['foo']
is evaluated before the string is constructed. Just like when you feed arguments to a function, the arguments are evaluated before the function does anything.
edited Nov 23 '18 at 16:08
answered Nov 23 '18 at 15:35
jppjpp
103k2166116
103k2166116
add a comment |
add a comment |
This has nothing to do with f
-strings. f
strings are common strings once evaluated. What you are trying would be a problem with standard strings too
The problem is that
'a "b" c'
is declares the literal a "b" c
while
'a 'b' c'
the quotes close and reopen. So, it is equivalent to string a
, followed by variable b
, followed by string c
.
That's the whole reason python supports both types of quotation marks
add a comment |
This has nothing to do with f
-strings. f
strings are common strings once evaluated. What you are trying would be a problem with standard strings too
The problem is that
'a "b" c'
is declares the literal a "b" c
while
'a 'b' c'
the quotes close and reopen. So, it is equivalent to string a
, followed by variable b
, followed by string c
.
That's the whole reason python supports both types of quotation marks
add a comment |
This has nothing to do with f
-strings. f
strings are common strings once evaluated. What you are trying would be a problem with standard strings too
The problem is that
'a "b" c'
is declares the literal a "b" c
while
'a 'b' c'
the quotes close and reopen. So, it is equivalent to string a
, followed by variable b
, followed by string c
.
That's the whole reason python supports both types of quotation marks
This has nothing to do with f
-strings. f
strings are common strings once evaluated. What you are trying would be a problem with standard strings too
The problem is that
'a "b" c'
is declares the literal a "b" c
while
'a 'b' c'
the quotes close and reopen. So, it is equivalent to string a
, followed by variable b
, followed by string c
.
That's the whole reason python supports both types of quotation marks
answered Nov 23 '18 at 15:34
blue_noteblue_note
12.4k32536
12.4k32536
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53449308%2fwhy-dont-f-strings-play-nicely-with-dictionaries%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
How would you mark the end of the string if
'
didn't mean'
?– Peter Wood
Nov 23 '18 at 15:34
See answer here stackoverflow.com/questions/4630465/…
– yoonghm
Nov 23 '18 at 15:36