mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
merge heads
This commit is contained in:
commit
bd9c655c97
6 changed files with 41 additions and 17 deletions
|
@ -323,6 +323,11 @@ The following classes are provided:
|
||||||
A catch-all class to handle unknown URLs.
|
A catch-all class to handle unknown URLs.
|
||||||
|
|
||||||
|
|
||||||
|
.. class:: HTTPErrorProcessor()
|
||||||
|
|
||||||
|
Process HTTP error responses.
|
||||||
|
|
||||||
|
|
||||||
.. _request-objects:
|
.. _request-objects:
|
||||||
|
|
||||||
Request Objects
|
Request Objects
|
||||||
|
@ -926,7 +931,7 @@ UnknownHandler Objects
|
||||||
HTTPErrorProcessor Objects
|
HTTPErrorProcessor Objects
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
.. method:: HTTPErrorProcessor.unknown_open()
|
.. method:: HTTPErrorProcessor.http_response()
|
||||||
|
|
||||||
Process HTTP error responses.
|
Process HTTP error responses.
|
||||||
|
|
||||||
|
@ -938,6 +943,13 @@ HTTPErrorProcessor Objects
|
||||||
:exc:`HTTPError` if no other handler handles the error.
|
:exc:`HTTPError` if no other handler handles the error.
|
||||||
|
|
||||||
|
|
||||||
|
.. method:: HTTPErrorProcessor.https_response()
|
||||||
|
|
||||||
|
Process HTTPS error responses.
|
||||||
|
|
||||||
|
The behavior is same as :meth:`http_response`.
|
||||||
|
|
||||||
|
|
||||||
.. _urllib-request-examples:
|
.. _urllib-request-examples:
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
|
|
|
@ -339,8 +339,7 @@ Available Functions
|
||||||
Write a warning to a file. The default implementation calls
|
Write a warning to a file. The default implementation calls
|
||||||
``formatwarning(message, category, filename, lineno, line)`` and writes the
|
``formatwarning(message, category, filename, lineno, line)`` and writes the
|
||||||
resulting string to *file*, which defaults to ``sys.stderr``. You may replace
|
resulting string to *file*, which defaults to ``sys.stderr``. You may replace
|
||||||
this function with an alternative implementation by assigning to
|
this function with any callable by assigning to ``warnings.showwarning``.
|
||||||
``warnings.showwarning``.
|
|
||||||
*line* is a line of source code to be included in the warning
|
*line* is a line of source code to be included in the warning
|
||||||
message; if *line* is not supplied, :func:`showwarning` will
|
message; if *line* is not supplied, :func:`showwarning` will
|
||||||
try to read the line specified by *filename* and *lineno*.
|
try to read the line specified by *filename* and *lineno*.
|
||||||
|
|
|
@ -168,7 +168,8 @@ class TestBasicOps(unittest.TestCase):
|
||||||
self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
|
self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
|
||||||
self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
|
self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
|
||||||
|
|
||||||
# Test implementation detail: tuple re-use
|
@support.impl_detail("tuple reuse is specific to CPython")
|
||||||
|
def test_combinations_tuple_reuse(self):
|
||||||
self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
|
self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
|
||||||
self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
|
self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
|
||||||
|
|
||||||
|
@ -238,7 +239,9 @@ class TestBasicOps(unittest.TestCase):
|
||||||
self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
|
self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
|
||||||
self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
|
self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
|
||||||
|
|
||||||
# Test implementation detail: tuple re-use
|
@support.impl_detail("tuple reuse is specific to CPython")
|
||||||
|
def test_combinations_with_replacement_tuple_reuse(self):
|
||||||
|
cwr = combinations_with_replacement
|
||||||
self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
|
self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
|
||||||
self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
|
self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
|
||||||
|
|
||||||
|
@ -302,7 +305,8 @@ class TestBasicOps(unittest.TestCase):
|
||||||
self.assertEqual(result, list(permutations(values, None))) # test r as None
|
self.assertEqual(result, list(permutations(values, None))) # test r as None
|
||||||
self.assertEqual(result, list(permutations(values))) # test default r
|
self.assertEqual(result, list(permutations(values))) # test default r
|
||||||
|
|
||||||
# Test implementation detail: tuple re-use
|
@support.impl_detail("tuple resuse is CPython specific")
|
||||||
|
def test_permutations_tuple_reuse(self):
|
||||||
self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
|
self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
|
||||||
self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
|
self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
|
||||||
|
|
||||||
|
@ -566,11 +570,13 @@ class TestBasicOps(unittest.TestCase):
|
||||||
self.assertEqual(list(zip()), lzip())
|
self.assertEqual(list(zip()), lzip())
|
||||||
self.assertRaises(TypeError, zip, 3)
|
self.assertRaises(TypeError, zip, 3)
|
||||||
self.assertRaises(TypeError, zip, range(3), 3)
|
self.assertRaises(TypeError, zip, range(3), 3)
|
||||||
# Check tuple re-use (implementation detail)
|
|
||||||
self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
|
self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
|
||||||
lzip('abc', 'def'))
|
lzip('abc', 'def'))
|
||||||
self.assertEqual([pair for pair in zip('abc', 'def')],
|
self.assertEqual([pair for pair in zip('abc', 'def')],
|
||||||
lzip('abc', 'def'))
|
lzip('abc', 'def'))
|
||||||
|
|
||||||
|
@support.impl_detail("tuple reuse is specific to CPython")
|
||||||
|
def test_zip_tuple_reuse(self):
|
||||||
ids = list(map(id, zip('abc', 'def')))
|
ids = list(map(id, zip('abc', 'def')))
|
||||||
self.assertEqual(min(ids), max(ids))
|
self.assertEqual(min(ids), max(ids))
|
||||||
ids = list(map(id, list(zip('abc', 'def'))))
|
ids = list(map(id, list(zip('abc', 'def'))))
|
||||||
|
@ -613,11 +619,13 @@ class TestBasicOps(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
self.fail('Did not raise Type in: ' + stmt)
|
self.fail('Did not raise Type in: ' + stmt)
|
||||||
|
|
||||||
# Check tuple re-use (implementation detail)
|
|
||||||
self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
|
self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
|
||||||
list(zip('abc', 'def')))
|
list(zip('abc', 'def')))
|
||||||
self.assertEqual([pair for pair in zip_longest('abc', 'def')],
|
self.assertEqual([pair for pair in zip_longest('abc', 'def')],
|
||||||
list(zip('abc', 'def')))
|
list(zip('abc', 'def')))
|
||||||
|
|
||||||
|
@support.impl_detail("tuple reuse is specific to CPython")
|
||||||
|
def test_zip_longest_tuple_reuse(self):
|
||||||
ids = list(map(id, zip_longest('abc', 'def')))
|
ids = list(map(id, zip_longest('abc', 'def')))
|
||||||
self.assertEqual(min(ids), max(ids))
|
self.assertEqual(min(ids), max(ids))
|
||||||
ids = list(map(id, list(zip_longest('abc', 'def'))))
|
ids = list(map(id, list(zip_longest('abc', 'def'))))
|
||||||
|
@ -721,7 +729,8 @@ class TestBasicOps(unittest.TestCase):
|
||||||
args = map(iter, args)
|
args = map(iter, args)
|
||||||
self.assertEqual(len(list(product(*args))), expected_len)
|
self.assertEqual(len(list(product(*args))), expected_len)
|
||||||
|
|
||||||
# Test implementation detail: tuple re-use
|
@support.impl_detail("tuple reuse is specific to CPython")
|
||||||
|
def test_product_tuple_reuse(self):
|
||||||
self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
|
self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
|
||||||
self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
|
self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
|
||||||
|
|
||||||
|
|
|
@ -512,12 +512,11 @@ class _WarningsTests(BaseTest):
|
||||||
def test_showwarning_not_callable(self):
|
def test_showwarning_not_callable(self):
|
||||||
with original_warnings.catch_warnings(module=self.module):
|
with original_warnings.catch_warnings(module=self.module):
|
||||||
self.module.filterwarnings("always", category=UserWarning)
|
self.module.filterwarnings("always", category=UserWarning)
|
||||||
old_showwarning = self.module.showwarning
|
self.module.showwarning = print
|
||||||
|
with support.captured_output('stdout'):
|
||||||
|
self.module.warn('Warning!')
|
||||||
self.module.showwarning = 23
|
self.module.showwarning = 23
|
||||||
try:
|
self.assertRaises(TypeError, self.module.warn, "Warning!")
|
||||||
self.assertRaises(TypeError, self.module.warn, "Warning!")
|
|
||||||
finally:
|
|
||||||
self.module.showwarning = old_showwarning
|
|
||||||
|
|
||||||
def test_show_warning_output(self):
|
def test_show_warning_output(self):
|
||||||
# With showarning() missing, make sure that output is okay.
|
# With showarning() missing, make sure that output is okay.
|
||||||
|
@ -547,10 +546,13 @@ class _WarningsTests(BaseTest):
|
||||||
globals_dict = globals()
|
globals_dict = globals()
|
||||||
oldfile = globals_dict['__file__']
|
oldfile = globals_dict['__file__']
|
||||||
try:
|
try:
|
||||||
with original_warnings.catch_warnings(module=self.module) as w:
|
catch = original_warnings.catch_warnings(record=True,
|
||||||
|
module=self.module)
|
||||||
|
with catch as w:
|
||||||
self.module.filterwarnings("always", category=UserWarning)
|
self.module.filterwarnings("always", category=UserWarning)
|
||||||
globals_dict['__file__'] = None
|
globals_dict['__file__'] = None
|
||||||
original_warnings.warn('test', UserWarning)
|
original_warnings.warn('test', UserWarning)
|
||||||
|
self.assertTrue(len(w))
|
||||||
finally:
|
finally:
|
||||||
globals_dict['__file__'] = oldfile
|
globals_dict['__file__'] = oldfile
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ What's New in Python 3.3 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #10271: Allow warnings.showwarning() be any callable.
|
||||||
|
|
||||||
- Issue #11627: Fix segfault when __new__ on a exception returns a non-exception
|
- Issue #11627: Fix segfault when __new__ on a exception returns a non-exception
|
||||||
class.
|
class.
|
||||||
|
|
||||||
|
|
|
@ -409,10 +409,10 @@ warn_explicit(PyObject *category, PyObject *message,
|
||||||
else {
|
else {
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
|
|
||||||
if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) {
|
if (!PyCallable_Check(show_fxn)) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"warnings.showwarning() must be set to a "
|
"warnings.showwarning() must be set to a "
|
||||||
"function or method");
|
"callable");
|
||||||
Py_DECREF(show_fxn);
|
Py_DECREF(show_fxn);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue