Skip to content

Commit 155062d

Browse files
committed
[stdlib] Allow FileHandler.stream to be None
FileHandler sets self.stream = None in two CPython code paths: delay=True in __init__ and after close(). Override the inherited StreamHandler.stream type to reflect this.
1 parent d7595e2 commit 155062d

2 files changed

Lines changed: 8 additions & 0 deletions

File tree

stdlib/@tests/test_cases/check_logging.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from __future__ import annotations
22

3+
import io
34
import logging
45
import logging.handlers
56
import multiprocessing
67
import queue
78
from typing import Any
89

10+
from typing_extensions import assert_type
11+
912
# This pattern comes from the logging docs, and should therefore pass a type checker
1013
# See https://docs.python.org/3/library/logging.html#logrecord-objects
1114

@@ -28,3 +31,7 @@ def record_factory(*args: Any, **kwargs: Any) -> logging.LogRecord:
2831
logging.handlers.QueueListener(queue.Queue())
2932
logging.handlers.QueueListener(queue.SimpleQueue())
3033
logging.handlers.QueueListener(multiprocessing.Queue())
34+
35+
# FileHandler.stream can be None when delay=True or after close()
36+
fh = logging.FileHandler("test.log", delay=True)
37+
assert_type(fh.stream, io.TextIOWrapper | None)

stdlib/logging/__init__.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,7 @@ class FileHandler(StreamHandler[TextIOWrapper]):
616616
encoding: str | None # undocumented
617617
delay: bool # undocumented
618618
errors: str | None # undocumented
619+
stream: TextIOWrapper | None # type: ignore[assignment] # None when delay=True or after close()
619620
def __init__(
620621
self, filename: StrPath, mode: str = "a", encoding: str | None = None, delay: bool = False, errors: str | None = None
621622
) -> None: ...

0 commit comments

Comments
 (0)