diff --git a/scrapy/http/request/__init__.py b/scrapy/http/request/__init__.py index 187238b1cb30df51ec288d5ab426ea49cdff70b2..4dce92880bc074539b85a23e915c3ca88624765e 100644 --- a/scrapy/http/request/__init__.py +++ b/scrapy/http/request/__init__.py @@ -96,20 +96,12 @@ class Request(object_ref): """Return a copy of this Request""" return self.replace() - def replace(self, url=None, callback=None, method=None, headers=None, body=None, \ - cookies=None, meta=None, encoding=None, priority=None, \ - dont_filter=None, errback=None): + def replace(self, *args, **kwargs): """Create a new Request with the same attributes except for those given new values. """ - return self.__class__(url=self.url if url is None else url, - callback=callback, - method=self.method if method is None else method, - headers=copy.deepcopy(self.headers) if headers is None else headers, - body=self.body if body is None else body, - cookies=self.cookies if cookies is None else cookies, - meta=self.meta if meta is None else meta, - encoding=self.encoding if encoding is None else encoding, - priority=self.priority if priority is None else priority, - dont_filter=self.dont_filter if dont_filter is None else dont_filter, - errback=errback) + for x in ['url', 'method', 'headers', 'body', 'cookies', 'meta', \ + 'encoding', 'priority', 'dont_filter']: + kwargs.setdefault(x, getattr(self, x)) + cls = kwargs.pop('cls', self.__class__) + return cls(*args, **kwargs) diff --git a/scrapy/http/response/__init__.py b/scrapy/http/response/__init__.py index f632ea117941140ea6a255897802b8422004731f..251e77ad777967be8c76059f21902e15a4becf60 100644 --- a/scrapy/http/response/__init__.py +++ b/scrapy/http/response/__init__.py @@ -71,18 +71,11 @@ class Response(object_ref): """Return a copy of this Response""" return self.replace() - def replace(self, url=None, status=None, headers=None, body=None, meta=None, \ - flags=None, cls=None, **kwargs): + def replace(self, *args, **kwargs): """Create a new Response with the same attributes except for those given new values. """ - if cls is None: - cls = self.__class__ - new = cls(url=self.url if url is None else url, - status=self.status if status is None else status, - headers=copy.deepcopy(self.headers) if headers is None else headers, - body=self.body if body is None else body, - meta=self.meta if meta is None else meta, - flags=self.flags if flags is None else flags, - **kwargs) - return new + for x in ['url', 'status', 'headers', 'body', 'meta', 'flags']: + kwargs.setdefault(x, getattr(self, x)) + cls = kwargs.pop('cls', self.__class__) + return cls(*args, **kwargs)