Merge
This commit is contained in:
commit
9498839a1a
|
@ -1094,6 +1094,40 @@ parentheses go around the format string and the arguments, not just the format
|
||||||
string. That's because the __ notation is just syntax sugar for a constructor
|
string. That's because the __ notation is just syntax sugar for a constructor
|
||||||
call to one of the XXXMessage classes.
|
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
|
.. currentmodule:: logging
|
||||||
|
|
||||||
|
|
|
@ -338,11 +338,11 @@ with.
|
||||||
...
|
...
|
||||||
>>> test()
|
>>> 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`:
|
instead of `patch.object`:
|
||||||
|
|
||||||
>>> mock = MagicMock(return_value = sentinel.file_handle)
|
>>> mock = MagicMock(return_value=sentinel.file_handle)
|
||||||
>>> with patch('__builtin__.open', mock):
|
>>> with patch('builtins.open', mock):
|
||||||
... handle = open('filename', 'r')
|
... handle = open('filename', 'r')
|
||||||
...
|
...
|
||||||
>>> mock.assert_called_with('filename', 'r')
|
>>> mock.assert_called_with('filename', 'r')
|
||||||
|
|
|
@ -550,7 +550,7 @@ def findsource(object):
|
||||||
|
|
||||||
file = getfile(object)
|
file = getfile(object)
|
||||||
sourcefile = getsourcefile(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')
|
raise OSError('source code not available')
|
||||||
file = sourcefile if sourcefile else file
|
file = sourcefile if sourcefile else file
|
||||||
|
|
||||||
|
|
|
@ -416,6 +416,12 @@ class TestBuggyCases(GetSourceBase):
|
||||||
finally:
|
finally:
|
||||||
del linecache.cache[co.co_filename]
|
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):
|
class TestNoEOL(GetSourceBase):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.tempdir = TESTFN + '_dir'
|
self.tempdir = TESTFN + '_dir'
|
||||||
|
|
|
@ -297,6 +297,9 @@ Core and Builtins
|
||||||
Library
|
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 #17540: Added style to formatter configuration by dict.
|
||||||
|
|
||||||
- Issue #16692: The ssl module now supports TLS 1.1 and TLS 1.2. Initial
|
- Issue #16692: The ssl module now supports TLS 1.1 and TLS 1.2. Initial
|
||||||
|
|
Loading…
Reference in New Issue