62
62
from collections import namedtuple
63
63
64
64
try :
65
- from typing import Optional
66
-
67
- try :
68
- from typing import Protocol
69
- except ImportError :
70
- from typing_extensions import Protocol
65
+ from typing import Optional , Hashable
66
+ from typing_extensions import Protocol
71
67
72
68
class WriteableStream (Protocol ):
73
69
"""Any stream that can ``write`` strings"""
@@ -245,20 +241,23 @@ def emit(self, record: LogRecord) -> None:
245
241
logger_cache = {}
246
242
247
243
248
- def _addLogger (logger_name : str ) -> None :
244
+ def _addLogger (logger_name : Hashable ) -> None :
249
245
"""Adds the logger if it doesn't already exist"""
250
246
if logger_name not in logger_cache :
251
247
new_logger = Logger (logger_name )
252
248
new_logger .addHandler (StreamHandler ())
253
249
logger_cache [logger_name ] = new_logger
254
250
255
251
256
- def getLogger (logger_name : str ) -> "Logger" :
252
+ def getLogger (logger_name : Hashable = "" ) -> "Logger" :
257
253
"""Create or retrieve a logger by name; only retrieves loggers
258
254
made using this function; if a Logger with this name does not
259
255
exist it is created
260
256
261
- :param str logger_name: The name of the `Logger` to create/retrieve.
257
+ :param Hashable logger_name: The name of the `Logger` to create/retrieve, this
258
+ is typically a ``str``. If none is provided, the single root logger will
259
+ be created/retrieved. Note that unlike CPython, a blank string will also
260
+ access the root logger.
262
261
"""
263
262
_addLogger (logger_name )
264
263
return logger_cache [logger_name ]
@@ -267,12 +266,12 @@ def getLogger(logger_name: str) -> "Logger":
267
266
class Logger :
268
267
"""The actual logger that will provide the logging API.
269
268
270
- :param str name: The name of the logger, typically assigned by the
271
- value from `getLogger`
269
+ :param Hashable name: The name of the logger, typically assigned by the
270
+ value from `getLogger`; this is typically a ``str``
272
271
:param int level: (optional) The log level, default is ``NOTSET``
273
272
"""
274
273
275
- def __init__ (self , name : str , level : int = NOTSET ) -> None :
274
+ def __init__ (self , name : Hashable , level : int = NOTSET ) -> None :
276
275
"""Create an instance."""
277
276
self ._level = level
278
277
self .name = name
0 commit comments