2016-12-13 5 views
1

Это паукВызов метода Паука из трубопровода - Python Scrapy

class TicketsSpider(scrapy.Spider): 

    def __set_last_start_date(self, dateString): 
     #code here 

Это Pipeline

class TicketsPipeline(object): 

    def spider_closed(self, spider): 
     spider.__set_last_start_date(spider.lastAdScrapedDate) 

    @classmethod 
    def from_crawler(cls, crawler): 
     pipeline = cls() 
     crawler.signals.connect(pipeline.spider_closed, signals.spider_closed) 
     return pipeline 

Я хочу вызвать __set_last_start_date() функцию от spider_closed() метода. Но я получаю эту ошибку

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 149, in maybeDeferred 
    result = f(*args, **kw) 
    File "build/bdist.linux-x86_64/egg/pydispatch/robustapply.py", line 55, in robustApply 
    File "tickets/pipelines.py", line 236, in spider_closed 
    spider.__set_last_start_date(spider.lastAdScrapedDate) 
AttributeError: 'TicketsSpider' object has no attribute '_TicketsPipeline__set_last_start_date' 
2016-12-13 02:49:53 [scrapy] INFO: Dumping Scrapy stats: 

Я могу заверить вас, что я могу получить spider.lastAdScrapedDate но я не могу назвать spider.__set_last_start_date

+0

Вы способны вызвать любой другой метод паука? Правильно ли задано '__set_last_start_date'? Возможно, вам нужно исследовать с помощью отладчика –

+0

Я могу получить 'spider.lastAdScrapedDate', но я не могу назвать' spider .__ set_last_start_date' – Umair

+0

Я говорю о методах, а не атрибутах. Почему ошибка упоминает объект '_TicketsPipeline__set_last_start_date', а не' 'TicketsSpider 'не имеет атрибута' __set_last_start_date''? Попробуйте с pdb –

ответ

3

имен, в классе, с двойным подчеркиванием ведущим предназначены быть частным.

Любой идентификатор вида __spam (по крайней мере, два ведущих подчеркивания, не более одного знака подчеркивания) является текстуально заменен _classname__spam, где имя_класса является текущее имя класса с начальным символом подчеркивания (ов) раздели.

Для получения подробной информации см. this.

вариант 1. Вы можете переименовать имя метода, а не использовать двойное подчеркивание.

вариант 2. Если вы хотите сохранить имя метода, а затем вызвать его таким образом, но я не думаю, что это хорошая идея:

def close_spider(self, spider): 
     spider._TicketsSpider__set_last_start_date(spider.lastAdScrapedDate) 
+0

Спасибо @pennyliangliping, я понятия не имел, что это сделал двойной знак подчеркивания. –

+0

@ pennyliangliping никогда не думал об этом: P – Umair

Смежные вопросы