D-string vs str.dedent() (original) (raw)

And Python will calculate this for you! One of my favorite parlor tricks:

>>> import tokenize
>>> tokenize._all_string_prefixes()
{'', 'b', 'rf', 'fR', 'Rb', 'bR', 'RB', 'Rf', 'B', 'u', 'RF', 'BR', 'U', 'R', 'F', 'f', 'rB', 'fr', 'FR', 'rF', 'rb', 'r', 'br', 'Fr
', 'Br'}
>>> len(tokenize._all_string_prefixes())
25

If you add “rd”, “fd”, and “frd”:

>>> import tokenize
>>> tokenize._all_string_prefixes()
{'', 'DFR', 'rF', 'fRd', 'fRD', 'rFD', 'dR', 'fDr', 'FD', 'DR', 'drF', 'RDF', 'dFR', 'BR', 'Dr', 'RB', 'Rfd', 'fDR', 'RFd', 'B', 'u'
, 'rd', 'r', 'Rdf', 'fr', 'frD', 'Df', 'fdr', 'Br', 'rfd', 'fD', 'DrF', 'FR', 'Fd', 'rDF', 'rdf', 'f', 'Frd', 'Fr', 'dr', 'fdR', 'Rb
', 'DRF', 'bR', 'DRf', 'frd', 'Rd', 'dF', 'Drf', 'fd', 'Rf', 'R', 'FRD', 'dfr', 'FdR', 'RdF', 'FDR', 'RDf', 'U', 'DFr', 'rdF', 'Fdr'
, 'rB', 'rb', 'FrD', 'RFD', 'dRF', 'df', 'rDf', 'dFr', 'DfR', 'drf', 'rFd', 'RfD', 'fR', 'DF', 'FRd', 'FDr', 'dfR', 'b', 'RF', 'Dfr'
, 'F', 'rD', 'rf', 'rfD', 'RD', 'dRf', 'br'}
>>> len(tokenize._all_string_prefixes())
89

When I added f-strings, I argued that we should restrict it to lower case, even when used in combination with other characters, so that “fR” would be invalid, although “fr” and “rf” would be okay. But I lost that one.