
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
76 lines
2.0 KiB
Plaintext
76 lines
2.0 KiB
Plaintext
== Why is this an issue?
|
|
|
|
Python concatenates adjacent string or byte literals at compile time. It means that ``++"a" "b"++`` is equivalent to ``++"ab"++``. This is sometimes used to split a long string on multiple lines. However an implicit string concatenation can also be very confusing. In the following contexts it might indicate that a comma was forgotten:
|
|
|
|
* when the two strings are on the same line it looks like a badly formatted tuple. Parenthesises are not mandatory to create a tuple, only the comma is.
|
|
* when the strings are in a list, set or tuple.
|
|
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,python]
|
|
----
|
|
def func():
|
|
return "item1" "item2" # Noncompliant
|
|
|
|
["1",
|
|
"2" # Noncompliant
|
|
"3",
|
|
"a very very very" # Noncompliant
|
|
"very very long string",
|
|
"4"]
|
|
----
|
|
|
|
|
|
=== Compliant solution
|
|
|
|
[source,python]
|
|
----
|
|
def func():
|
|
return "item1", "item2"
|
|
|
|
["1",
|
|
"2",
|
|
"3",
|
|
"a very very very" +
|
|
"very very long string",
|
|
"4"]
|
|
----
|
|
|
|
|
|
=== Exceptions
|
|
|
|
No issue will be raised when there is a visible reason for the string concatenation:
|
|
|
|
* when the quotes used for both strings are different. This can be used to avoid escaping quotes
|
|
* when the strings or bytes have different prefixes, i.e. "f" for f-strings, "r" for raw, "u" for unicode and no prefix for normal strings.
|
|
* when strings are visibly split to avoid long lines of code. (Example: the first string ends with a space, punctuation or ``++\n++``).
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
When the strings are on multiple lines:
|
|
|
|
* "Add a "+" operator to make the string concatenation explicit; or did you forget a comma?"
|
|
When the strings are on the same line:
|
|
|
|
* "Merge these implicitly concatenated strings; or did you forget a comma?"
|
|
|
|
|
|
=== Highlighting
|
|
|
|
Primary: The end quote of the first concatenated string/bytes literal
|
|
|
|
Secondary:
|
|
|
|
* location: the starting quote of the next string/bytes/literal
|
|
* no message
|
|
|
|
|
|
endif::env-github,rspecator-view[]
|