Skip to content

Commit cf8888f

Browse files
[logging] Fix Formatter.converter assignment in subclasses
Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
1 parent deabec1 commit cf8888f

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

stdlib/@tests/test_cases/check_logging.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging.handlers
55
import multiprocessing
66
import queue
7+
import time
78
from typing import Any
89

910
# This pattern comes from the logging docs, and should therefore pass a type checker
@@ -28,3 +29,8 @@ def record_factory(*args: Any, **kwargs: Any) -> logging.LogRecord:
2829
logging.handlers.QueueListener(queue.Queue())
2930
logging.handlers.QueueListener(queue.SimpleQueue())
3031
logging.handlers.QueueListener(multiprocessing.Queue())
32+
33+
34+
# Formatter.converter can be overridden with time.gmtime or time.localtime (regression test for #14880)
35+
class UTCFormatter(logging.Formatter):
36+
converter = time.gmtime

stdlib/logging/__init__.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ if sys.version_info >= (3, 12):
267267
def getHandlerNames() -> frozenset[str]: ...
268268

269269
class Formatter:
270-
converter: Callable[[float | None], struct_time]
270+
converter: ClassVar[Callable[[float | None], struct_time]]
271271
_fmt: str | None # undocumented
272272
datefmt: str | None # undocumented
273273
_style: PercentStyle # undocumented

0 commit comments

Comments
 (0)