Python Literal r'\' Not Accepted

前端 未结 5 2071
感情败类
感情败类 2021-01-17 08:25

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\"\\\"

5条回答
  •  北海茫月
    2021-01-17 08:59

    The backslash can be used to make a following quote not terminate the string:

    >>> r'\''
    "\\'"
    

    So r'foo\' or r'\' are unterminated literals.

    Rationale

    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):

    • Simplifies lexing for the Python interpreter itself (all string literals have the same semantics: A closing quote not followed by an odd number of backslashes terminates the string)
    • Simplifies lexing for syntax highlighting engines (this is a strong argument because most programming languages don't have raw strings that are still enclosed in single or double quotes and lots of syntax highlighting engines are badly broken because they use inappropriate tools like regular expressions to do the lexing)

    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:

    • You can just use normal string literals and escape the backslashes or read the strings from a raw file
    • backslashes in string literals are typically needed in one of these two cases:
      • you provide the string as input to another language interpreter which uses backslashes as a quoting character, like regular expressions. In this case you won't ever need a backslash at the end of a string
      • you are using \ 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.

    Solutions

    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.

提交回复
热议问题