如何在存根文件中为内部函数或嵌套函数添加类型提示



如何在存根文件中添加内部函数(或嵌套函数)的类型提示?

parsable_base.py中的代码

class TemplateBase:
def copy(self, _parent=None):
def walk_properties(template_based):
for prop_holder in template_based.properties.values():
if isinstance(prop_holder.prop, TemplateBase):
walk_properties(prop_holder.prop)
elif isinstance(prop_value, PrimitiveBase):
value_copies[prop_value] = prop_value.copy()
else:
references.append(prop_value)
value_copies = {}
references = []
walk_properties(self)

parsable_base.pyi中的代码

class TemplateBase(ParsableBase):
def copy(self: _T, _parent=...) -> _T: ...

我想在内部函数walk_properties中为参数template_based添加一个类型提示(TemplateBase)。

我知道我可以在代码文件(parsable_base.py)中添加它,如:
def walk_properties(template_based: TemplateBase) -> None:

但我想保持我的代码文件干净,并将其添加到存根文件(parsable_base.pyi)。我想应该是这样的:

class TemplateBase(ParsableBase):
def copy(self: _T, _parent=...) -> _T:
def walk_properties(template_based: TemplateBase) -> None: ...

但是我的IDE (PyCharm)不识别它,所以我认为这是错误的。

我怎样才能做得好呢?

parsable_base.py和parsable_base.pyPyi在同一个文件夹(包)。

嵌套函数不是API的一部分,因为它是不可访问的(例如,尝试在函数下键入提示随机变量会起到相同的作用),因此存根文件不能记录它。

如果库是您自己的,我建议您直接在Python文件

中输入

我相信这是你所面临的问题的一个最小版本:

class A:
def func(self, var: A) -> None:
...

生产:

Traceback (most recent call last):
File "...72658624.py", line 2, in <module>
class A:
File "...72658624.py", line 3, in A
def func(self, var: A) -> None:
NameError: name 'A' is not defined

这个问题可以通过从__future__导入annotations来解决:

from __future__ import annotations
class A:
def func(self, var: A) -> None:
...

现在可以正确编译了。请参阅PEP 563了解更多信息。简而言之,这允许为尚未定义的名称提供类型提示。您可以猜到,当Python解析文件时,遇到var: A时,类A还没有完全定义,从而导致问题。