SimpleNamespace 是否有类型提示?

问题描述 投票:0回答:1

假设我正在定义一个返回types.SimpleNamespace的函数。我想输入提示结果:

from types import SimpleNamespace

def func() -> SimpleNamespace(x: int, y: str):  # SyntaxError! What should be used instead?
    return SimpleNamespace(x=3, y='abc')

请注意,

SimpleNamespace
通常用作
tuple
的替代,其中数据成员被命名。对于元组,存在相应的类型提示:

from typing import Tuple

def func() -> Tuple[int, str]:  # OK
    return 3, 'abc'

顺便说一句,今天我使用以下内容作为文档:

from types import SimpleNamespace

def func() -> SimpleNamespace(x=int, y=str):  # Seems to work fine
    return SimpleNamespace(x=3, y='abc')

但这不是标准的(因此类型检查器不支持它),并且可能不是正确的 Python(或者是吗?)。

python python-typing
1个回答
0
投票

答案是否定的;没有普遍接受的方法来支持

SimpleNamespace
s 上的类型提示。

SimpleNamespace.__getattribute__
的类型提示是来自
python/typeshed
的官方
Any
中的types.pyi,即
reveal_type(namespace.attr) # -> Any
。其次,您应该注意
SimpleNamespace
是非通用的。
理论上,您可以创建自己的
types.pyi
存根,但可能性非常有限。

使其静态工作的通用方法是类型检查器对

SimpleNamespace
进行特殊处理并跟踪它们的属性和类型。然而,他们这样做的可能性很小。
SimpleNamespace
用于 dynamic 创建,如果您已经知道什么类型,则应该使用像
dataclass
TypedDict
这样支持 static 类型信息的构造。

在这里您可以找到有关该主题的一些讨论和问答:

https://discuss.python.org/t/typing-rules-for-simplenamespace/60906
https://github.com/microsoft/pyright/issues/4697

© www.soinside.com 2019 - 2024. All rights reserved.