mirror of https://github.com/python/cpython
merge heads
This commit is contained in:
commit
bd9c655c97
|
@ -323,6 +323,11 @@ The following classes are provided:
|
|||
A catch-all class to handle unknown URLs.
|
||||
|
||||
|
||||
.. class:: HTTPErrorProcessor()
|
||||
|
||||
Process HTTP error responses.
|
||||
|
||||
|
||||
.. _request-objects:
|
||||
|
||||
Request Objects
|
||||
|
@ -926,7 +931,7 @@ UnknownHandler Objects
|
|||
HTTPErrorProcessor Objects
|
||||
--------------------------
|
||||
|
||||
.. method:: HTTPErrorProcessor.unknown_open()
|
||||
.. method:: HTTPErrorProcessor.http_response()
|
||||
|
||||
Process HTTP error responses.
|
||||
|
||||
|
@ -938,6 +943,13 @@ HTTPErrorProcessor Objects
|
|||
: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:
|
||||
|
||||
Examples
|
||||
|
|
|
@ -339,8 +339,7 @@ Available Functions
|
|||
Write a warning to a file. The default implementation calls
|
||||
``formatwarning(message, category, filename, lineno, line)`` and writes the
|
||||
resulting string to *file*, which defaults to ``sys.stderr``. You may replace
|
||||
this function with an alternative implementation by assigning to
|
||||
``warnings.showwarning``.
|
||||
this function with any callable by assigning to ``warnings.showwarning``.
|
||||
*line* is a line of source code to be included in the warning
|
||||
message; if *line* is not supplied, :func:`showwarning` will
|
||||
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(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.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(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.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))) # 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.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
|
||||
|
||||
|
@ -566,11 +570,13 @@ class TestBasicOps(unittest.TestCase):
|
|||
self.assertEqual(list(zip()), lzip())
|
||||
self.assertRaises(TypeError, zip, 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')],
|
||||
lzip('abc', 'def'))
|
||||
self.assertEqual([pair for pair in zip('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')))
|
||||
self.assertEqual(min(ids), max(ids))
|
||||
ids = list(map(id, list(zip('abc', 'def'))))
|
||||
|
@ -613,11 +619,13 @@ class TestBasicOps(unittest.TestCase):
|
|||
else:
|
||||
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')],
|
||||
list(zip('abc', 'def')))
|
||||
self.assertEqual([pair for pair in zip_longest('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')))
|
||||
self.assertEqual(min(ids), max(ids))
|
||||
ids = list(map(id, list(zip_longest('abc', 'def'))))
|
||||
|
@ -721,7 +729,8 @@ class TestBasicOps(unittest.TestCase):
|
|||
args = map(iter, args)
|
||||
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.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
|
||||
|
||||
|
|
|
@ -512,12 +512,11 @@ class _WarningsTests(BaseTest):
|
|||
def test_showwarning_not_callable(self):
|
||||
with original_warnings.catch_warnings(module=self.module):
|
||||
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
|
||||
try:
|
||||
self.assertRaises(TypeError, self.module.warn, "Warning!")
|
||||
finally:
|
||||
self.module.showwarning = old_showwarning
|
||||
self.assertRaises(TypeError, self.module.warn, "Warning!")
|
||||
|
||||
def test_show_warning_output(self):
|
||||
# With showarning() missing, make sure that output is okay.
|
||||
|
@ -547,10 +546,13 @@ class _WarningsTests(BaseTest):
|
|||
globals_dict = globals()
|
||||
oldfile = globals_dict['__file__']
|
||||
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)
|
||||
globals_dict['__file__'] = None
|
||||
original_warnings.warn('test', UserWarning)
|
||||
self.assertTrue(len(w))
|
||||
finally:
|
||||
globals_dict['__file__'] = oldfile
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@ What's New in Python 3.3 Alpha 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #10271: Allow warnings.showwarning() be any callable.
|
||||
|
||||
- Issue #11627: Fix segfault when __new__ on a exception returns a non-exception
|
||||
class.
|
||||
|
||||
|
|
|
@ -409,10 +409,10 @@ warn_explicit(PyObject *category, PyObject *message,
|
|||
else {
|
||||
PyObject *res;
|
||||
|
||||
if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) {
|
||||
if (!PyCallable_Check(show_fxn)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"warnings.showwarning() must be set to a "
|
||||
"function or method");
|
||||
"callable");
|
||||
Py_DECREF(show_fxn);
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue