Lets say I have two variables
self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
and
self.SuperLongSpecificCorperateVariableNameIcantChangeControl
And I need to compare them.
The issue being that, when I put them both in an if statement, it blows past the style checker's line length.
if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication != self.SuperLongSpecificCorperateVariableNameIcantChangeControl):
The way around this would be to split this into two lines.
if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication \
!= self.SuperLongSpecificCorperateVariableNameIcantChangeControl):
My coworkers are split on whether PEP 8 has you split between conditionals or whether you can split up a conditional itself. Ideally we would get approval to change the variable name, but in the meantime, what does PEP 8 say we should do in this case?
Firstly, PEP 8 says you can split long lines under Maximum Line Length:
Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation.
In fact, the backslash in your example is not needed because of the parentheses.
PEP 8 says you can split a conditional under multiline if-statements, although the main focus of that section is how to distinguish it from the following block.
When the conditional part of an
if
-statement is long enough to require that it be written across multiple lines, it's worth noting that the combination of a two character keyword (i.e.if
), plus a single space, plus an opening parenthesis creates a natural 4-space indent for the subsequent lines of the multiline conditional. This can produce a visual conflict with the indented suite of code nested inside theif
-statement, which would also naturally be indented to 4 spaces. This PEP takes no explicit position on how (or whether) to further visually distinguish such conditional lines from the nested suite inside theif
-statement. Acceptable options in this situation include, but are not limited to:# No extra indentation. if (this_is_one_thing and that_is_another_thing): do_something() # Add a comment, which will provide some distinction in editors # supporting syntax highlighting. if (this_is_one_thing and that_is_another_thing): # Since both conditions are true, we can frobnicate. do_something() # Add some extra indentation on the conditional continuation line. if (this_is_one_thing and that_is_another_thing): do_something()
Personally, I would go for the last option for maximum readability. So that gives us:
if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
!= self.SuperLongSpecificCorperateVariableNameIcantChangeControl):
do_something()
You could use temporary "internal use" names to shorten the line:
_Comm = self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
_Control = self.SuperLongSpecificCorperateVariableNameIcantChangeControl
if _Comm != _Control:
do_something()
This is assuming the context is not in a local scope. If it is actually in a local scope, they don't need to be "internal use".
You could use a helper function to give them shorter names in a local scope. Since they're attributes, you can pass in their object:
def _compare(instance):
a = instance.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
b = instance.SuperLongSpecificCorperateVariableNameIcantChangeControl
return a != b
if _compare(self):
do_something()