英文:
What is the type of a Logger function like Logger.info?
问题
如何为类似Logger.info的Logger函数添加类型注释?使用reveal_type返回的结果如下:
Revealed type is "def (msg: builtins.object, *args: builtins.object, *, exc_info: Union[None, builtins.bool, Tuple[Type[builtins.BaseException], builtins.BaseException, Union[types.TracebackType, None]], Tuple[None, None, None], builtins.BaseException] =, stack_info: builtins.bool =, stacklevel: builtins.int =, extra: Union[typing.Mapping[builtins.str, builtins.object], None] =)"。
一定有更简洁的类型注释,如何找到它呢?
英文:
How do I type annotate a Logger function like Logger.info? Using reveal_type returns this:
Revealed type is "def (msg: builtins.object, *args: builtins.object, *, exc_info: Union[None, builtins.bool, Tuple[Type[builtins.BaseException], builtins.BaseException, Union[types.TracebackType, None]], Tuple[None, None, None], builtins.BaseException] =, stack_info: builtins.bool =, stacklevel: builtins.int =, extra: Union[typing.Mapping[builtins.str, builtins.object], None] =)"
There must be a more concise type for this, how do I go about finding it?
答案1
得分: 1
以下是已翻译的内容:
"Revealing the type shows you the exact signature of the function. The most accurate annotation would be using a custom tailored callable protocol reflecting that exact function signature."
"这会显示函数的确切签名。最准确的注释是使用自定义的可调用 协议,反映该确切的函数签名。"
"To shamelessly steal from typeshed:"
"为了无耻地从 typeshed 偷取:"
"This should be compatible with Python 3.8+
."
"这应该与 Python 3.8+
兼容。"
"To contrast this with the simplest possible annotation based on collections.abc.Callable
, the following of course works too."
"与基于 collections.abc.Callable
的最简单的可能注释相对比,以下当然也可以工作。"
"And there are options in between. Depending on what you want this for."
"之间还有一些选项,具体取决于你想要什么。"
英文:
It depends on how precise you want/need it.
Revealing the type shows you the exact signature of the function. The most accurate annotation would be using a custom tailored callable protocol reflecting that exact function signature.
To shamelessly steal from typeshed:
from collections.abc import Mapping
from logging import getLogger
from types import TracebackType
from typing import Optional, Protocol, Union
from typing_extensions import TypeAlias
_SysExcInfoType: TypeAlias = Union[
tuple[type[BaseException], BaseException, Optional[TracebackType]],
tuple[None, None, None],
]
_ExcInfoType: TypeAlias = Union[None, bool, _SysExcInfoType, BaseException]
class LogMethod(Protocol):
def __call__(
self,
msg: object,
*args: object,
exc_info: _ExcInfoType = None,
stack_info: bool = False,
stacklevel: int = 1,
extra: Optional[Mapping[str, object]] = None,
) -> None:
...
log = getLogger(__name__)
x: LogMethod = log.info
This should be compatible with Python 3.8+
.
To contrast this with the simplest possible annotation based on collections.abc.Callable
, the following of course works too.
from collections.abc import Callable
log = getLogger(__name__)
y: Callable[..., None] = log.info
And there are options in between. Depending on what you want this for.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论