r'\'
in Python does not work as expected. Instead of returning a string with one character (a backslash) in it, it raises a SyntaxError. r"\"
does the same.
This is rather cumbersome if you have a list of Windows paths like these:
paths = [ r'\bla\foo\bar', r'\bla\foo\bloh', r'\buff', r'\', # ... ]
Is there a good reason why this literal is not accepted?
In Python strings, the backslash "\" is a special character, also called the "escape" character. It is used in representing certain whitespace characters: "\t" is a tab, "\n" is a newline, and "\r" is a carriage return.
The r means that the string is to be treated as a raw string, which means all escape codes will be ignored. For an example: '\n' will be treated as a newline character, while r'\n' will be treated as the characters \ followed by n .
Python raw string is created by prefixing a string literal with 'r' or 'R'. Python raw string treats backslash (\) as a literal character. This is useful when we want to have a string that contains backslash and don't want it to be treated as an escape character.
Escape sequences In Python, characters that cannot be represented in a normal string (such as tabs, line feeds. etc.) are described using an escape sequence with a backslash \ (such as \t or \n ), similar to the C language.
This is in accordance with the documentation:
When an
'r'
or'R'
prefix is present, a character following a backslash is included in the string without change, and all backslashes are left in the string. For example, the string literalr"\n"
consists of two characters: a backslash and a lowercase'n'
. String quotes can be escaped with a backslash, but the backslash remains in the string; for example,r"\""
is a valid string literal consisting of two characters: a backslash and a double quote;r"\"
is not a valid string literal (even a raw string cannot end in an odd number of backslashes). Specifically, a raw string cannot end in a single backslash (since the backslash would escape the following quote character). Note also that a single backslash followed by a newline is interpreted as those two characters as part of the string, not as a line continuation.
Use "\\"
instead, or, better even, use /
as path separator (yes, this works on Windows).
The backslash can be used to make a following quote not terminate the string:
>>> r'\'' "\\'"
So r'foo\'
or r'\'
are unterminated literals.
Because you specifically asked for the reasoning behind this design decision, relevant aspects could be the following (although this is all based on speculation, of course):
So yes, there are probably important reasons why this way was chosen, even if you don't agree with these because you think that your specific use case is more important. It is however not, for the following reasons:
\
as a path separator, which is usually not necessary because Python supports /
as a path separator on Windows and because there's os.path.sep
.You can use '\\'
or "\\"
instead:
>>> print("\\") \
Or if you're completely crazy, you can use raw string literal and combine them with normal literals just for the ending backslash or even use string slicing:
>>> r'C:\some\long\freakin\file\path''\\' 'C:\\some\\long\\freakin\\file\\path\\' >>> r'C:\some\long\freakin\file\path\ '[:-1] 'C:\\some\\long\\freakin\\file\\path\\'
Or, in your particular case, you could just do:
paths = [ x.replace('/', '\\') for x in ''' /bla/foo/bar /bla/foo/bloh /buff / '''.strip().split()]
Which would save you some typing when adding more paths, as an additional bonus.
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