methof ans tests

This commit is contained in:
Will McGugan 2022-11-30 17:10:33 +07:00
parent 0e48776fb2
commit 090523e734
2 changed files with 49 additions and 0 deletions

24
rich/_fileno.py Normal file
View File

@ -0,0 +1,24 @@
from __future__ import annotations
from typing import IO, Callable
def get_fileno(file_like: IO[str]) -> int | None:
"""Get fileno() from a file, accounting for poorly implemented file-like objects.
Args:
file_like (IO): A file-like object.
Returns:
int | None: The result of fileno if available, or None if operation failed.
"""
fileno: Callable[[], int] | None = getattr(file_like, "fileno", None)
if fileno is not None:
try:
return fileno()
except Exception:
# `fileno` is documented as potentially raising a OSError
# Alas, from the issues, there are so many poorly implemented file-like objects,
# that `fileno()` can raise just about anything.
return None
return None

25
tests/test_getfileno.py Normal file
View File

@ -0,0 +1,25 @@
from rich._fileno import get_fileno
def test_get_fileno():
class FileLike:
def fileno(self) -> int:
return 123
assert get_fileno(FileLike()) == 123
def test_get_fileno_missing():
class FileLike:
pass
assert get_fileno(FileLike()) is None
def test_get_fileno_broken():
class FileLike:
def fileno(self) -> int:
1 / 0
return 123
assert get_fileno(FileLike()) is None