Why doesn't Python give any error when quotes around a string do not match?
PythonPython 3.xStringQuotesPython Problem Overview
I've started learning Python recently and I don't understand why Python behaves like this:
>>> "OK" 'OK' >>> """OK""" 'OK' >>> "not Ok' File "<stdin>", line 1 "not Ok' ^ SyntaxError: EOL while scanning string literal >>> "not OK""" 'not OK'
Why doesn't it give an error for the last statement as the number of quotes does not match?
Python Solutions
Solution 1 - Python
The final """
is not recognized as a triple-quotation, but a single "
(to close the current string literal) followed by an empty string ""
; the two juxtaposed string literals are concatenated. The same behavior can be more readily recognized by putting a space between the closing and opening "
.
>>> "not OK" ""
'not OK'
Solution 2 - Python
"not OK"""
Python interprets this as "not OK"+""
If you give "not Ok""ay"
, you will get the output as 'not Okay'
Solution 3 - Python
You would think that there is no difference between " or ', but in reality, Python uses a greedy method to accept input.
Once Python sees a matching quotation, then that ends the statement.
It's why you can write something like "'s" ""
. Inside the string there is a '
but because you're in a string, python doesn't raise an error. Then after that, there is a "
followed by "
but that's a different (empty) string.
If you do something like "s'
then Python is looking for that next "
before if runs your command.
Solution 4 - Python
Python uses like a stack implementation to detect quotes opening and closing. If you know whats a stack is, its a datastructure, in which Last element will be removed first.
Assume your string is A = "''"
What it does is, for every single quote or double quote encountered first time, it will add it the stack, and for every second, it will remove from the stack, unless its ofcourse, """
which will be parsed as single one
In our example, A = "''"
, iterating over it, for the first 2 elements, they will be added to stack and for the next 2, they will be removed.
So the quotes will be matched, if and only if, the number of elements in the stack in the end must be zero