6262from collections import namedtuple
6363
6464try :
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
7167
7268 class WriteableStream (Protocol ):
7369 """Any stream that can ``write`` strings"""
@@ -245,20 +241,23 @@ def emit(self, record: LogRecord) -> None:
245241logger_cache = {}
246242
247243
248- def _addLogger (logger_name : str ) -> None :
244+ def _addLogger (logger_name : Hashable ) -> None :
249245 """Adds the logger if it doesn't already exist"""
250246 if logger_name not in logger_cache :
251247 new_logger = Logger (logger_name )
252248 new_logger .addHandler (StreamHandler ())
253249 logger_cache [logger_name ] = new_logger
254250
255251
256- def getLogger (logger_name : str ) -> "Logger" :
252+ def getLogger (logger_name : Hashable = "" ) -> "Logger" :
257253 """Create or retrieve a logger by name; only retrieves loggers
258254 made using this function; if a Logger with this name does not
259255 exist it is created
260256
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.
262261 """
263262 _addLogger (logger_name )
264263 return logger_cache [logger_name ]
@@ -267,12 +266,12 @@ def getLogger(logger_name: str) -> "Logger":
267266class Logger :
268267 """The actual logger that will provide the logging API.
269268
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``
272271 :param int level: (optional) The log level, default is ``NOTSET``
273272 """
274273
275- def __init__ (self , name : str , level : int = NOTSET ) -> None :
274+ def __init__ (self , name : Hashable , level : int = NOTSET ) -> None :
276275 """Create an instance."""
277276 self ._level = level
278277 self .name = name
0 commit comments