Rename Request.kwargs to Request.cb_kwargs

This commit is contained in:
Eugenio Lacuesta 2019-03-15 22:32:45 +00:00
parent 645e8d16a4
commit 6760bca74b
9 changed files with 33 additions and 31 deletions

View File

@ -24,7 +24,7 @@ below in :ref:`topics-request-response-ref-request-subclasses` and
Request objects
===============
.. class:: Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback, flags, kwargs])
.. class:: Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback, flags, cb_kwargs])
A :class:`Request` object represents an HTTP request, which is usually
generated in the Spider and executed by the Downloader, and thus generating
@ -126,8 +126,8 @@ Request objects
:param flags: Flags sent to the request, can be used for logging or similar purposes.
:type flags: list
:param kwargs: A dict with arbitrary data that will be passed as keyword arguments to the Request's callback.
:type kwargs: dict
:param cb_kwargs: A dict with arbitrary data that will be passed as keyword arguments to the Request's callback.
:type cb_kwargs: dict
.. attribute:: Request.url
@ -168,7 +168,7 @@ Request objects
``copy()`` or ``replace()`` methods, and can also be accessed, in your
spider, from the ``response.meta`` attribute.
.. attribute:: Request.kwargs
.. attribute:: Request.cb_kwargs
A dictionary that contains arbitrary metadata for this request. Its contents
will be passed to the Request's callback as keyword arguments. It is empty
@ -177,7 +177,7 @@ Request objects
This dict is `shallow copied`_ when the request is cloned using the
``copy()`` or ``replace()`` methods, and can also be accessed, in your
spider, from the ``response.kwargs`` attribute.
spider, from the ``response.cb_kwargs`` attribute.
.. _shallow copied: https://docs.python.org/2/library/copy.html
@ -216,7 +216,7 @@ Example::
In some cases you may be interested in passing arguments to those callback
functions so you can receive the arguments later, in the second callback.
The following two examples show how to achieve this by using the
:attr:`Request.meta` and :attr:`Request.kwargs` attributes respectively::
:attr:`Request.meta` and :attr:`Request.cb_kwargs` attributes respectively::
def parse_page1(self, response):
item = MyItem()
@ -238,8 +238,8 @@ The following two examples show how to achieve this by using the
item['main_url'] = response.url
request = scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
request.kwargs['item'] = item
request.kwargs['foo'] = 'bar'
request.cb_kwargs['item'] = item
request.cb_kwargs['foo'] = 'bar'
yield request
def parse_page2(self, response, item, foo):

View File

@ -143,7 +143,9 @@ class Scraper(object):
def call_spider(self, result, request, spider):
result.request = request
dfd = defer_result(result)
dfd.addCallbacks(request.callback or spider.parse, request.errback, callbackKeywords=request.kwargs)
dfd.addCallbacks(callback=request.callback or spider.parse,
errback=request.errback,
callbackKeywords=request.cb_kwargs)
return dfd.addCallback(iterate_spider_output)
def handle_spider_error(self, _failure, request, response, spider):

View File

@ -18,7 +18,7 @@ class Request(object_ref):
def __init__(self, url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None, kwargs=None):
dont_filter=False, errback=None, flags=None, cb_kwargs=None):
self._encoding = encoding # this one has to be set first
self.method = str(method).upper()
@ -40,14 +40,14 @@ class Request(object_ref):
self.dont_filter = dont_filter
self._meta = dict(meta) if meta else None
self._kwargs = dict(kwargs) if kwargs else None
self._cb_kwargs = dict(cb_kwargs) if cb_kwargs else None
self.flags = [] if flags is None else list(flags)
@property
def kwargs(self):
if self._kwargs is None:
self._kwargs = {}
return self._kwargs
def cb_kwargs(self):
if self._cb_kwargs is None:
self._cb_kwargs = {}
return self._cb_kwargs
@property
def meta(self):
@ -99,7 +99,7 @@ class Request(object_ref):
given new values.
"""
for x in ['url', 'method', 'headers', 'body', 'cookies', 'meta', 'flags',
'encoding', 'priority', 'dont_filter', 'callback', 'errback', 'kwargs']:
'encoding', 'priority', 'dont_filter', 'callback', 'errback', 'cb_kwargs']:
kwargs.setdefault(x, getattr(self, x))
cls = kwargs.pop('cls', self.__class__)
return cls(*args, **kwargs)

View File

@ -106,7 +106,7 @@ class Response(object_ref):
def follow(self, url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, kwargs=None):
dont_filter=False, errback=None, cb_kwargs=None):
# type: (...) -> Request
"""
Return a :class:`~.Request` instance to follow a link ``url``.
@ -133,4 +133,4 @@ class Response(object_ref):
priority=priority,
dont_filter=dont_filter,
errback=errback,
kwargs=kwargs)
cb_kwargs=cb_kwargs)

View File

@ -123,7 +123,7 @@ class TextResponse(Response):
def follow(self, url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None, encoding=None, priority=0,
dont_filter=False, errback=None, kwargs=None):
dont_filter=False, errback=None, cb_kwargs=None):
# type: (...) -> Request
"""
Return a :class:`~.Request` instance to follow a link ``url``.
@ -155,7 +155,7 @@ class TextResponse(Response):
priority=priority,
dont_filter=dont_filter,
errback=errback,
kwargs=kwargs,
cb_kwargs=cb_kwargs,
)

View File

@ -33,7 +33,7 @@ def request_to_dict(request, spider=None):
'priority': request.priority,
'dont_filter': request.dont_filter,
'flags': request.flags,
'kwargs': request.kwargs,
'cb_kwargs': request.cb_kwargs,
}
if type(request) is not Request:
d['_class'] = request.__module__ + '.' + request.__class__.__name__
@ -66,7 +66,7 @@ def request_from_dict(d, spider=None):
priority=d['priority'],
dont_filter=d['dont_filter'],
flags=d.get('flags'),
kwargs=d.get('kwargs'),
cb_kwargs=d.get('cb_kwargs'),
)

View File

@ -35,8 +35,8 @@ class KeywordArgumentsSpider(MockServerSpider):
def start_requests(self):
data = {'key': 'value', 'number': 123}
yield Request(self.mockserver.url('/first'), self.parse_first, kwargs=data)
yield Request(self.mockserver.url('/general_with'), self.parse_general, kwargs=data)
yield Request(self.mockserver.url('/first'), self.parse_first, cb_kwargs=data)
yield Request(self.mockserver.url('/general_with'), self.parse_general, cb_kwargs=data)
yield Request(self.mockserver.url('/general_without'), self.parse_general)
yield Request(self.mockserver.url('/no_kwargs'), self.parse_no_kwargs)
@ -47,7 +47,7 @@ class KeywordArgumentsSpider(MockServerSpider):
yield response.follow(
self.mockserver.url('/two'),
self.parse_second,
kwargs={'new_key': 'new_value'})
cb_kwargs={'new_key': 'new_value'})
def parse_second(self, response, new_key):
self.checks.append(new_key == 'new_value')

View File

@ -177,7 +177,7 @@ class RequestTest(unittest.TestCase):
r1 = self.request_class("http://www.example.com", flags=['f1', 'f2'],
callback=somecallback, errback=somecallback)
r1.meta['foo'] = 'bar'
r1.kwargs['key'] = 'value'
r1.cb_kwargs['key'] = 'value'
r2 = r1.copy()
# make sure copy does not propagate callbacks
@ -190,9 +190,9 @@ class RequestTest(unittest.TestCase):
assert r1.flags is not r2.flags, "flags must be a shallow copy, not identical"
self.assertEqual(r1.flags, r2.flags)
# make sure kwargs dict is shallow copied
assert r1.kwargs is not r2.kwargs, "kwargs must be a shallow copy, not identical"
self.assertEqual(r1.kwargs, r2.kwargs)
# make sure cb_kwargs dict is shallow copied
assert r1.cb_kwargs is not r2.cb_kwargs, "cb_kwargs must be a shallow copy, not identical"
self.assertEqual(r1.cb_kwargs, r2.cb_kwargs)
# make sure meta dict is shallow copied
assert r1.meta is not r2.meta, "meta must be a shallow copy, not identical"

View File

@ -26,7 +26,7 @@ class RequestSerializationTest(unittest.TestCase):
encoding='latin-1',
priority=20,
meta={'a': 'b'},
kwargs={'k': 'v'},
cb_kwargs={'k': 'v'},
flags=['testFlag'])
self._assert_serializes_ok(r, spider=self.spider)
@ -53,7 +53,7 @@ class RequestSerializationTest(unittest.TestCase):
self.assertEqual(r1.headers, r2.headers)
self.assertEqual(r1.cookies, r2.cookies)
self.assertEqual(r1.meta, r2.meta)
self.assertEqual(r1.kwargs, r2.kwargs)
self.assertEqual(r1.cb_kwargs, r2.cb_kwargs)
self.assertEqual(r1._encoding, r2._encoding)
self.assertEqual(r1.priority, r2.priority)
self.assertEqual(r1.dont_filter, r2.dont_filter)