[Python-checkins] cpython (merge default -> default): Merge

antoine.pitrou python-checkins at python.org
Sat Mar 30 16:34:38 CET 2013


http://hg.python.org/cpython/rev/096a97f3ffc9
changeset: 83022:096a97f3ffc9
parent: 83021:02f9335b7efb
parent: 83014:efb44458afcd
user: Antoine Pitrou <solipsis at pitrou.net>
date: Sat Mar 30 16:29:54 2013 +0100
summary:
 Merge
files:
 Doc/howto/logging-cookbook.rst | 34 ++++++++++++++
 Doc/library/unittest.mock-examples.rst | 6 +-
 Lib/inspect.py | 2 +-
 Lib/test/test_inspect.py | 6 ++
 Misc/NEWS | 3 +
 5 files changed, 47 insertions(+), 4 deletions(-)
diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst
--- a/Doc/howto/logging-cookbook.rst
+++ b/Doc/howto/logging-cookbook.rst
@@ -1094,6 +1094,40 @@
 string. That's because the __ notation is just syntax sugar for a constructor
 call to one of the XXXMessage classes.
 
+If you prefer, you can use a :class:`LoggerAdapter` to achieve a similar effect
+to the above, as in the following example::
+
+ import logging
+
+ class Message(object):
+ def __init__(self, fmt, args):
+ self.fmt = fmt
+ self.args = args
+
+ def __str__(self):
+ return self.fmt.format(*self.args)
+
+ class StyleAdapter(logging.LoggerAdapter):
+ def __init__(self, logger, extra=None):
+ super(StyleAdapter, self).__init__(logger, extra or {})
+
+ def log(self, level, msg, *args, **kwargs):
+ if self.isEnabledFor(level):
+ msg, kwargs = self.process(msg, kwargs)
+ self.logger._log(level, Message(msg, args), (), **kwargs)
+
+ logger = StyleAdapter(logging.getLogger(__name__))
+
+ def main():
+ logger.debug('Hello, {}', 'world!')
+
+ if __name__ == '__main__':
+ logging.basicConfig(level=logging.DEBUG)
+ main()
+
+The above script should log the message ``Hello, world!`` when run with
+Python 3.2 or later.
+
 
 .. currentmodule:: logging
 
diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst
--- a/Doc/library/unittest.mock-examples.rst
+++ b/Doc/library/unittest.mock-examples.rst
@@ -338,11 +338,11 @@
 ...
 >>> test()
 
-If you are patching a module (including `__builtin__`) then use `patch`
+If you are patching a module (including :mod:`builtins`) then use `patch`
 instead of `patch.object`:
 
- >>> mock = MagicMock(return_value = sentinel.file_handle)
- >>> with patch('__builtin__.open', mock):
+ >>> mock = MagicMock(return_value=sentinel.file_handle)
+ >>> with patch('builtins.open', mock):
 ... handle = open('filename', 'r')
 ...
 >>> mock.assert_called_with('filename', 'r')
diff --git a/Lib/inspect.py b/Lib/inspect.py
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -550,7 +550,7 @@
 
 file = getfile(object)
 sourcefile = getsourcefile(object)
- if not sourcefile and file[0] + file[-1] != '<>':
+ if not sourcefile and file[:1] + file[-1:] != '<>':
 raise OSError('source code not available')
 file = sourcefile if sourcefile else file
 
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -416,6 +416,12 @@
 finally:
 del linecache.cache[co.co_filename]
 
+ def test_findsource_without_filename(self):
+ for fname in ['', '<string>']:
+ co = compile('x=1', fname, "exec")
+ self.assertRaises(IOError, inspect.findsource, co)
+ self.assertRaises(IOError, inspect.getsource, co)
+
 class TestNoEOL(GetSourceBase):
 def __init__(self, *args, **kwargs):
 self.tempdir = TESTFN + '_dir'
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -297,6 +297,9 @@
 Library
 -------
 
+- Issue #17526: fix an IndexError raised while passing code without filename to
+ inspect.findsource(). Initial patch by Tyler Doyle.
+
 - Issue #17540: Added style to formatter configuration by dict.
 
 - Issue #16692: The ssl module now supports TLS 1.1 and TLS 1.2. Initial
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /