53 lines
1.2 KiB
Python
53 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
from contextlib import contextmanager
|
|
from pathlib import Path
|
|
from typing import TYPE_CHECKING, Any, cast
|
|
|
|
if TYPE_CHECKING:
|
|
from collections.abc import Iterator
|
|
|
|
|
|
@contextmanager
|
|
def PortableTemporaryFile(
|
|
mode: str = "w+b",
|
|
*,
|
|
buffering: int = -1,
|
|
encoding: str | None = None,
|
|
newline: str | None = None,
|
|
suffix: str | None = None,
|
|
prefix: str | None = None,
|
|
dir: str | Path | None = None,
|
|
delete: bool = True,
|
|
errors: str | None = None,
|
|
) -> Iterator[Any]:
|
|
"""
|
|
Slightly more resilient version of the standard `NamedTemporaryFile`.
|
|
|
|
Plays better with Windows when using the 'delete' option.
|
|
"""
|
|
from tempfile import NamedTemporaryFile
|
|
|
|
params = cast(
|
|
Any,
|
|
{
|
|
"mode": mode,
|
|
"buffering": buffering,
|
|
"encoding": encoding,
|
|
"newline": newline,
|
|
"suffix": suffix,
|
|
"prefix": prefix,
|
|
"dir": dir,
|
|
"delete": False,
|
|
"errors": errors,
|
|
},
|
|
)
|
|
|
|
with NamedTemporaryFile(**params) as tmp:
|
|
try:
|
|
yield tmp
|
|
finally:
|
|
tmp.close()
|
|
if delete:
|
|
Path(tmp.name).unlink(missing_ok=True)
|