Передача списка внутри методов в классе - PullRequest
1 голос
/ 05 апреля 2020

У меня проблема с передачей переменной из метода в метод внутри данного класса.

Код такой (я практикующий начинающий):

class Calendar():
    def __init__(self,link):
        self.link = link
        self.request = requests.get(link)
        self.request.encoding='UTF-8'
        self.soup = BeautifulSoup(self.request.text,'lxml')

    def DaysMonth(self):
        Dates = []
        tds = self.soup.findAll('td',  {'class':'action'})
        for td in tds:
            check = (td.findAll('a')[0].text)
            if "Víkendová odstávka" in check:
                date = td.findAll('span')[0].text
                Dates.append(date)
        return Dates

    def PrintCal(self):
        return ['Víkendová odstávka serverů nastane ' + date + '. den v měsíci.' for date in Dates]

    def main(self):
        PrintCal(DaysMonth())

Я бы хотел передать список дат из метода DaysMonth в метод PrintCal. Когда я запускаю класс, то есть cal = Calendar ('link'), и запускаю cal.PrinCal (), я получаю, что имя Dates не было определено. Если я запускаю cal.DaysMonth (), вывод будет таким, как ожидалось.

В чем здесь проблема? Спасибо!

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Dates - это локальная переменная в методе DaysMonth, и поэтому ее больше нигде не видно. К счастью, DaysMonth возвращает Dates, поэтому легко получить желаемое значение. Просто добавьте следующую строку в ваш метод PrintCal (перед оператором return):

Dates = self.DaysMonth()
0 голосов
/ 05 апреля 2020

Вы пытаетесь сделать слишком много в объекте Calendar, особенно в методе init . Вы не хотите совмещать очистку и разбор веб-сайта во время создания объекта. Я бы использовал объект Calendar для хранения и отображения результатов очистки / разбора. Если вам нужно, чтобы все было объектно-ориентированным, создайте отдельный класс Scraper / Parser, который обрабатывает эту часть логики c.

class Calendar():
    def __init__(self, dates):
        self.dates = dates

    def display_dates(self):
        return ['Víkendová odstávka serverů nastane ' + date + '. den v měsíci.' 
                   for date in self.dates]


r = requests.get(link, encoding='UTF-8')
soup = BeautifulSoup(r.text,'lxml')
dates = []
for td in soup.findAll('td',  {'class':'action'}):
    check = (td.findAll('a')[0].text)
    if "Víkendová odstávka" in check:
        dates.append(td.findAll('span')[0].text)

c = Calendar(dates=dates)
print(c.display_dates)
...