Type hint for a file or file-like object?
Question: What is a best way in Python to hint a filename, so that it’s acceptable to pass anything into a function that you can open as a file? Especially both strings and files found via Pathlib. The easiest solution to this is to import it only during type-checking (because it’s the only time you need it): Lastly, in the current 3.10 beta build, has been renamed to , in order to separate the strings and the bytestrings from the paths of the Path module, and another AnyPath wont be seen soon.
How to type-annotate a file-like object in Python 3.8+
Previously typing.IO , typing.TextIO , and typing.BinaryIO were available to annotate file-like objects, e.g. those returned by open() . However, after Python 3.8 they seem to be deprecated, and will be removed in Python 3.12. Unlike many of the other deprecations like typing.List[T] , which is replaced by list[T] , these IO types have no clear migration path.
How should file-like object types be annotated in modern Python, going forward?
Python 3.9 docs has an unclear notice:
«These types are also in the typing.io namespace, which was never supported by type checkers and will be removed.»
See more in the discussion «[docs] Confusing deprecation notice for typing.IO»
In the new version of the docs it’s fixed:
«The typing.io namespace is deprecated and will be removed. These types should be directly imported from typing instead.»
Is there a way to concisely type hint an object interface?, If I type hint the function’s definition like so: from typing import Protocol, TypeVar T = TypeVar(«T») class
PYTHON : Type hint for a file or file-like object?
PYTHON : Type hint for a file or file-like object? [ Gift : Animated Search Engine : https Duration: 1:11
Type hint for a file or file-like object
Content is licensed under CC BY SA 2.5 and CC BY SA 3.0. Question / answer owners are mentioned in the video. Trademarks are property of respective owners and
How do I type hint a filename in a function?
What is a best way in Python to hint a filename, so that it’s acceptable to pass anything into a function that you can open as a file?
Especially both strings and files found via Pathlib.
def myfunc(filename: str) -> None: with open(filename) as f1: # do something here
I think what you are looking for is Structural Typing, which is not yet supported. It is proposed in PEP 544.
In the mean time, you could do a half-way effort by annotating with Union[str, bytes, os.PathLike] .
PEP 519 recommends using typing.Union[str, bytes, os.PathLike]
PEP 519 recommends using typing.Union[str, bytes, os.PathLike] .
and this is the easiest option.
But you should consider also _typeshed.AnyPath : it supports all kinds of paths in accordance with the different versions, and it is the default typing hint in the built-in library for filenames, such as in the function open() itself. Importing it results in your type helper recognising that the input should be a filename, and may help type hinting paths. It has also the variations _typeshed.StrPath for strings only and _typeshed.BytesPath for bytestrings only. Here for their definition.
However, you can’t just import the typeshed module, as it doesn’t exist at runtime. The easiest solution to this is to import it only during type-checking (because it’s the only time you need it):
from typing import TYPE_CHECKING AnyPath = None if TYPE_CHECKING: from _typeshed import AnyPath
Lastly, in the current 3.10 beta build, AnyPath has been renamed to StrOrBytesPath , in order to separate the strings and the bytestrings from the paths of the Path module, and another AnyPath wont be seen soon. So, if you are planning to input only str filenames, you can use _typeshed.StrPath , or just give up and use typing.Union[str, bytes, os.PathLike] .
How would you type hint Dict in Python with constant form but, one way of correctly type hinting would look like this: from typing import List, Dict, Union def some_func() -> List[Dict[str, Union[int,
Python type hints: How to specify file pointer as an argument?
I’m writing a function that takes a FILE pointer as an argument and writes to it. And I want to add a type hint to that argument:
def write_some_stuff(fp: _io.TextIOWrapper): .
_io.TextIOWrapper is what type(open(. )) gives me.
Is there something else I should use?
You should use the typing module, which was introduced in Python 3.5: typing.TextIO fits best in this case.
Generic type IO[AnyStr] and its subclasses TextIO(IO[str]) and BinaryIO(IO[bytes]) represent the types of I/O streams such as returned by open() .
from typing import TextIO def write_some_stuff(fp: TextIO): .
If you want to be a little more generic and allow any file object that is in text mode (i.e. read() returns Unicode strings), you probably want to hint that you take an io.TextIOBase argument. That will allow instances of io.StringIO in addition to the more common io.TextIOWrapper instances.
You also don’t need the underscore on the io module’s name, even if you stick with TextIOWrapper . The regular io module imports all relevant types from the _io module into its own namespace.
Python type hints: How to specify file pointer as an argument?, If you want to be a little more generic and allow any file object that is in text mode (i.e.