Сложно понять, что происходит в коде, когда в одной строке выполняется сразу много операций: и вызовы функций, и сложение, и вычитание, и сравнение. Приходится распутывать выражение, мысленно разбирая его на части.


Пример 1

Сложные выражения лучше разбивать, помещая промежуточные результаты в переменные с понятными названиями.

Плохо:


for number, link in enumerate(response.json()['links']['flickr']['original'], start=1):
...

Хорошо:


image_links = response.json()['links']['flickr']['original']
for number, link in enumerate(image_links, start=1):
    ...


Пример 2

Плохо:


import os
import urllib


def get_extension(url):
    image_link_index = 2
    extension_index = 1
    extension = os.path.splitext((urllib.parse.urlsplit(url)[image_link_index]))[extension_index]
    return extension

Хорошо:


import os
import urllib


def get_extension(url):
    image_link_index = 2
    extension_index = 1
    image_link = urllib.parse.urlsplit(url)[image_link_index]
    extension = os.path.splitext(image_link)[extension_index]
    return extension

Хорошо:


import os
import urllib


def get_extension(url):
    image_link_index = 2
    extension_index = 1
    image_link = urllib.parse.urlsplit(url)[image_link_index]
    return os.path.splitext(image_link)[extension_index]

Хорошо:


import os
import urllib


def get_extension(url):
    image_link_index = 2
    image_link = urllib.parse.urlsplit(url)[image_link_index]
    _, extension = os.path.splitext(image_link)
    return extension