Почему я должен использовать `return`, когда скрипт работает без этого? - PullRequest
0 голосов
/ 17 декабря 2018

Я создал скрипт, использующий Python для анализа названий фильмов и их лет, распределенных по нескольким страницам с торрент-сайта, и записи их в файл CSV.Он работает без ошибок и записывает данные в CSV-файл без каких-либо проблем.

Я сделал все это без использования этой самой строки return itemlist в моей функции get_data() и при создании этой функции write_data() полностью независим, поэтому я записал данные в CSV-файл, взятый из этого списка itemlist, расположенный под переменной URLS.

Если я сохраню существующий дизайн без изменений, необходимо ли использовать именно эту строкуreturn itemlist что закомментировано сейчас?Если так, то почему?

import requests
from bs4 import BeautifulSoup
import csv

URLS = ["https://yts.am/browse-movies?page={}".format(page) for page in range(1,6)]
itemlist = []

def get_data(links):
    for url in links:
        res = requests.get(url)
        soup = BeautifulSoup(res.text,"lxml")
        for record in soup.select('.browse-movie-bottom'):
            items = {}
            items["Name"] = record.select_one('.browse-movie-title').text
            items["Year"] = record.select_one('.browse-movie-year').text
            itemlist.append(items)
    # return itemlist

def write_data():
    with open("outputfile.csv","w", newline="") as f:
        writer = csv.DictWriter(f,['Name','Year'])
        writer.writeheader()
        for data in itemlist:
            writer.writerow(data)

if __name__ == '__main__':
    get_data(URLS)
    write_data()

Ответы [ 5 ]

0 голосов
/ 17 декабря 2018

Давайте сделаем это в консоли Python:

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...

В афоризме 2 говорится, что «явное лучше, чем неявное».Поэтому я думаю, что для удобства чтения лучше сообщить потенциальному пользователю этих функций, какие побочные эффекты ожидаются, вызывая их.И для этого вам нужно вернуть список данных, которые вы получаете, и дать ему write_data для своей работы.

В качестве автономного скрипта ваш скрипт хорош.Как библиотека, это не практично, если вы не вернете заполненный список.

0 голосов
/ 17 декабря 2018

Использование глобальной переменной на любом языке программирования не приветствуется.Если вы хотите повторно использовать свои функции, вы можете получить инструкцию return и передать результат в функцию write_data.Я бы посоветовал вам взглянуть на то, что @andersson дал выше

0 голосов
/ 17 декабря 2018

С существующим дизайном вам не нужна эта строка, потому что ваш get_data намеревается изменить список из внешней области видимости вместо список возврата .

Но если вы хотите переименовать itemlist, вам нужно переименовать его также в get_data и write_data (во всех функциях, которые могут его использовать)

Возможно, вам потребуется return itemlist если вы определяете write_data как

def write_data(some_list):
    ...

и используете его как

if __name__ == '__main__':
    write_data(get_data(URLS))

В этом случае write_data получает список, возвращенный get_data, и вам не нужноопределить itemlist = [] снаружи get_data

0 голосов
/ 17 декабря 2018

В этом конкретном случае ваш скрипт будет работать.Но не было бы неплохо повторно использовать вашу функцию где-то еще?В другом файле вы можете сказать:

from xy import get_data
links = ["url1", "url2",...]
a = get_data(links)

и работать с ним без необходимости переписывать функцию.

0 голосов
/ 17 декабря 2018

В вашем коде itemlist является глобальной переменной.Заявление о возврате не требуется в вышеуказанных случаях.

...