Search code examples
pythonstringpython-3.xpylint

How to format a long string while following pylint rules?


I have a very simple problem that I have been unable to find the solution to, so I thought I'd try my "luck" here.

I have a string that is created using variables and static text altogether. It is as follows:

filename_gps = 'id' + str(trip_id) + '_gps_did' + did + '_start' + str(trip_start) + '_end' + str(trip_end) + '.json'

However my problem is that pylint is complaining about this string reprensentation as it is too long. And here is the problem. How would I format this string representation over multiple lines without it looking weird and still stay within the "rules" of pylint?

At one point I ended up having it looking like this, however that is incredible "ugly" to look at:

filename_gps = 'id' + str(
    trip_id) + '_gps_did' + did + '_start' + str(
                trip_start) + '_end' + str(
                trip_end) + '.json'

I found that it would follow the "rules" of pylint if I formatted it like this:

filename_gps = 'id' + str(
    trip_id) + '_gps_did' + did + '_start' + str(
    trip_start) + '_end' + str(
    trip_end) + '.json'

Which is much "prettier" to look at, but in case I didn't have the "str()" casts, how would I go about creating such a string?

I doubt that there is a difference between pylint for Python 2.x and 3.x, but if there is I am using Python 3.x.


Solution

  • Don't use so many str() calls. Use string formatting:

    filename_gps = 'id{}_gps_did{}_start{}_end{}.json'.format(
        trip_id, did, trip_start, trip_end)
    

    If you do have a long expression with a lot of parts, you can create a longer logical line by using (...) parentheses:

    filename_gps = (
        'id' + str(trip_id) + '_gps_did' + did + '_start' +
        str(trip_start) + '_end' + str(trip_end) + '.json')
    

    This would work for breaking up a string you are using as a template in a formatting operation, too:

    foo_bar = (
        'This is a very long string with some {} formatting placeholders '
        'that is broken across multiple logical lines. Note that there are '
        'no "+" operators used, because Python auto-joins consecutive string '
        'literals.'.format(spam))