Громадный блок кода
Анти-паттерн
Когда блок кода перестаёт умещаться в половину экрана монитора - пора разбивать его на функции. Выберите то, что проще всего отщипнуть и поместите в отдельные функции. Также полезно разбивать и сами функции, когда в них становится слишком много строк.
Пример¶
В данном примере сложно понять, что происходит в функции. Куда проще, когда ключевые действия вынесены в отдельные функции. Так будет гораздо легче читать код.
Плохо:
def download_book(book_id, img_path="/path/to/img/", book_path="/path/to/file/"):
...
img_rel_path = soup.find('div', class_='bookimage').find('img')['src']
img_url = urljoin(book_page_url, img_rel_path)
response = requests.get(img_url)
...
with open(img_path, 'w') as img:
img.write(response.content)
...
response = requests.get(book_url)
...
with open(book_path, 'w') as book:
book.write(response.text)
...
Хорошо:
def download_text(url, book_path="/path/to/book/"):
response = requests.get(url)
...
with open(book_path, 'w') as book:
book.write(response.text)
def download_image(url, img_path="/path/to/img/"):
response = requests.get(url)
...
with open(img_path, 'w') as img:
img.write(response.content)
def get_image_url(soup, book_page_url):
img_rel_path = soup.find('div', class_='bookimage').find('img')['src']
img_url = urljoin(book_page_url, img_rel_path)
return img_url
def download_book(book_id):
...
img_url = get_image_url(soup, book_page_url)
download_image(img_url, img_path)
download_text(book_url, book_path)