diff -r f2353e74b335 Doc/library/urlparse.rst --- a/Doc/library/urlparse.rst Tue Jan 08 23:12:00 2013 +0200 +++ b/Doc/library/urlparse.rst Wed Jan 09 15:36:57 2013 +0100 @@ -105,6 +105,8 @@ +------------------+-------+--------------------------+----------------------+ | :attr:`fragment` | 5 | Fragment identifier | empty string | +------------------+-------+--------------------------+----------------------+ + | :attr:`userinfo` | | User info part | :const:`None` | + +------------------+-------+--------------------------+----------------------+ | :attr:`username` | | User name | :const:`None` | +------------------+-------+--------------------------+----------------------+ | :attr:`password` | | Password | :const:`None` | diff -r f2353e74b335 Lib/test/test_urlparse.py --- a/Lib/test/test_urlparse.py Tue Jan 08 23:12:00 2013 +0200 +++ b/Lib/test/test_urlparse.py Wed Jan 09 15:36:57 2013 +0100 @@ -50,6 +50,7 @@ self.assertEqual(result3.params, result.params) self.assertEqual(result3.query, result.query) self.assertEqual(result3.fragment, result.fragment) + self.assertEqual(result3.userinfo, result.userinfo) self.assertEqual(result3.username, result.username) self.assertEqual(result3.password, result.password) self.assertEqual(result3.hostname, result.hostname) @@ -74,6 +75,7 @@ self.assertEqual(result3.path, result.path) self.assertEqual(result3.query, result.query) self.assertEqual(result3.fragment, result.fragment) + self.assertEqual(result3.userinfo, result.userinfo) self.assertEqual(result3.username, result.username) self.assertEqual(result3.password, result.password) self.assertEqual(result3.hostname, result.hostname) @@ -399,6 +401,7 @@ self.assertEqual(p.path, "/doc/") self.assertEqual(p.query, "") self.assertEqual(p.fragment, "frag") + self.assertEqual(p.userinfo, None) self.assertEqual(p.username, None) self.assertEqual(p.password, None) self.assertEqual(p.hostname, "www.python.org") @@ -414,6 +417,7 @@ self.assertEqual(p.path, "/doc/") self.assertEqual(p.query, "query=yes") self.assertEqual(p.fragment, "frag") + self.assertEqual(p.userinfo, "User:Pass") self.assertEqual(p.username, "User") self.assertEqual(p.password, "Pass") self.assertEqual(p.hostname, "www.python.org") @@ -431,6 +435,7 @@ self.assertEqual(p.path, "/doc/") self.assertEqual(p.query, "query=yes") self.assertEqual(p.fragment, "frag") + self.assertEqual(p.userinfo, "User@example.com:Pass") self.assertEqual(p.username, "User@example.com") self.assertEqual(p.password, "Pass") self.assertEqual(p.hostname, "www.python.org") @@ -502,6 +507,7 @@ uri = "sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15" p = urlparse.urlsplit(uri) self.assertEqual(p.netloc, "") + self.assertEqual(p.userinfo, None) self.assertEqual(p.username, None) self.assertEqual(p.password, None) self.assertEqual(p.hostname, None) @@ -510,6 +516,7 @@ p = urlparse.urlparse(uri) self.assertEqual(p.netloc, "") + self.assertEqual(p.userinfo, None) self.assertEqual(p.username, None) self.assertEqual(p.password, None) self.assertEqual(p.hostname, None) diff -r f2353e74b335 Lib/urlparse.py --- a/Lib/urlparse.py Tue Jan 08 23:12:00 2013 +0200 +++ b/Lib/urlparse.py Wed Jan 09 15:36:57 2013 +0100 @@ -72,10 +72,16 @@ """Shared methods for the parsed result objects.""" @property - def username(self): + def userinfo(self): netloc = self.netloc if "@" in netloc: - userinfo = netloc.rsplit("@", 1)[0] + return netloc.rsplit("@", 1)[0] + return None + + @property + def username(self): + userinfo = self.userinfo + if self.userinfo: if ":" in userinfo: userinfo = userinfo.split(":", 1)[0] return userinfo @@ -83,11 +89,9 @@ @property def password(self): - netloc = self.netloc - if "@" in netloc: - userinfo = netloc.rsplit("@", 1)[0] - if ":" in userinfo: - return userinfo.split(":", 1)[1] + userinfo = self.userinfo + if userinfo and ":" in userinfo: + return userinfo.split(":", 1)[1] return None @property