classification
Title: Allow urllib.request.Request subclasses to override method
Type: Stage: resolved
Components: Library (Lib) Versions: Python 3.4
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: jason.coombs, orsenthil, python-dev
Priority: normal Keywords: patch

Created on 2013-09-08 16:41 by jason.coombs, last changed 2014-02-25 15:23 by python-dev. This issue is now closed.

Files
File name Uploaded Description Edit
6d6d68c068ad.diff jason.coombs, 2013-09-08 16:49 review
2b2744cfb08f.diff jason.coombs, 2013-09-08 16:55 review
061eb75339e2.diff jason.coombs, 2013-09-08 17:07 review
Repositories containing patches
http://hg.python.org/sandbox/cpython-issue18978
Messages (8)
msg197281 - (view) Author: Jason R. Coombs (jason.coombs) * (Python committer) Date: 2013-09-08 16:41
In Python 2.x and 3.2, I used to use a Request subclass I created for overriding the method used:

class MethodRequest(request.Request):
	def __init__(self, *args, **kwargs):
		"""
		Construct a MethodRequest. Usage is the same as for
		`urllib.request.Request` except it also takes an optional `method`
		keyword argument. If supplied, `method` will be used instead of
		the default.
		"""
		if 'method' in kwargs:
			self.method = kwargs.pop('method')
		return request.Request.__init__(self, *args, **kwargs)

	def get_method(self):
		return getattr(self, 'method', request.Request.get_method(self))

In Python 3.3, which now supports a method parameter, it broke this paradigm (because the method is stored in the instance and is always set to None in __init__ if not specified).

I believe a paradigm where the method is stored as a class attribute and possibly overridden in an instance would be much better, allowing for subclasses to simply and directly override the method. For example:

class HeadRequest(MethodRequest):
	method = 'HEAD'

That straightforward example works very well if method is allowed to be a class attribute, but won't work at all if 'method' is always set as an instance attribute in __init__.

And while it's possible for HeadRequest to override __init__, that requires HeadRequest to override that entire signature, which is less elegant than simply setting a class attribute.

For Python 3.4, I'd like to adapt the Request class to allow the Method to be defined at the class level (while still honoring customization at the instance level).
msg197283 - (view) Author: Senthil Kumaran (orsenthil) * (Python committer) Date: 2013-09-08 16:43
Hi Jason, 

Agree with you. This design change could be valuable in extending urllib.request.Request

Thanks!
msg197284 - (view) Author: Jason R. Coombs (jason.coombs) * (Python committer) Date: 2013-09-08 16:49
I've created a clone in which to draft this work.
msg197288 - (view) Author: Jason R. Coombs (jason.coombs) * (Python committer) Date: 2013-09-08 17:07
I've added tests to capture the new behavior.
msg198278 - (view) Author: Roundup Robot (python-dev) Date: 2013-09-22 14:11
New changeset 6d6d68c068ad by Jason R. Coombs in branch 'default':
Issue #18978: Allow Request.method to be defined at the class level.
http://hg.python.org/cpython/rev/6d6d68c068ad

New changeset 2b2744cfb08f by Jason R. Coombs in branch 'default':
Issue #18978: A more elegant technique for resolving the method
http://hg.python.org/cpython/rev/2b2744cfb08f

New changeset 061eb75339e2 by Jason R. Coombs in branch 'default':
Issue #18978: Add tests to capture expected behavior for class-level method overrides.
http://hg.python.org/cpython/rev/061eb75339e2

New changeset 8620aea9bbca by Jason R. Coombs in branch 'default':
Close #18978: Merge changes.
http://hg.python.org/cpython/rev/8620aea9bbca
msg198280 - (view) Author: Roundup Robot (python-dev) Date: 2013-09-22 14:17
New changeset 7f13d5ecf71f by Jason R. Coombs in branch 'default':
Issue #18978: Update docs to reflect explicitly the ability to set the attribute at the class level.
http://hg.python.org/cpython/rev/7f13d5ecf71f
msg198551 - (view) Author: Senthil Kumaran (orsenthil) * (Python committer) Date: 2013-09-28 20:53
Thanks for the this change, Jason. Docs could be updated to reflect this change (using ..versionchanged: directive). Thank you!
msg212184 - (view) Author: Roundup Robot (python-dev) Date: 2014-02-25 15:23
New changeset 1afbd851d1c1 by R David Murray in branch 'default':
whatsnew: Request.method can be overridden in subclasses (#18978).
http://hg.python.org/cpython/rev/1afbd851d1c1
History
Date User Action Args
2014-02-25 15:23:30python-devsetmessages: + msg212184
2013-09-28 20:53:43orsenthilsetmessages: + msg198551
2013-09-22 14:17:35python-devsetmessages: + msg198280
2013-09-22 14:11:15python-devsetstatus: open -> closed

nosy: + python-dev
messages: + msg198278

resolution: fixed
stage: resolved
2013-09-08 17:07:53jason.coombssetfiles: + 061eb75339e2.diff
2013-09-08 17:07:37jason.coombssetmessages: + msg197288
2013-09-08 16:55:01jason.coombssetfiles: + 2b2744cfb08f.diff
2013-09-08 16:49:33jason.coombssetfiles: + 6d6d68c068ad.diff
keywords: + patch
2013-09-08 16:49:04jason.coombssethgrepos: + hgrepo208
messages: + msg197284
2013-09-08 16:43:00orsenthilsetnosy: + orsenthil
messages: + msg197283
2013-09-08 16:41:28jason.coombscreate