假设我正在定义一个返回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(或者是吗?)。
答案是否定的;没有普遍接受的方法来支持
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