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
|
||||
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
|
||||
|
||||
|
|
|
@ -338,11 +338,11 @@ with.
|
|||
...
|
||||
>>> 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')
|
||||
|
|
|
@ -550,7 +550,7 @@ def findsource(object):
|
|||
|
||||
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
|
||||
|
||||
|
|
|
@ -416,6 +416,12 @@ class TestBuggyCases(GetSourceBase):
|
|||
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'
|
||||
|
|
|
@ -297,6 +297,9 @@ Core and Builtins
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue