我正在尝试使用 python 的 textx 模块来解释语法的语言原型。 我正在创建一个这样的模型:
from textx import metamodel_from_str
funl_grammar = """
Model: statement *= Statement;
Statement: FunctionDefinition | Function;
FunctionDefinition: name=ID '=' function=Function;
Function: name=ID '(' params*=Param (',' params*=Param)* ')';
Param: Function | INT | ID | STRING;
Comment: /#.*$/;
ID: /[a-zA-Z_][a-zA-Z0-9_]*/;
INT: /[0-9]+/;
STRING: /".*"/;
"""
mm = metamodel_from_str(funl_grammar)
现在我的问题是,如何使用 mypy 对其进行类型检查?
如果我创建一个像这样的函数,我想确保参数是我的语法的一部分,并且 textx 将其视为
Param
:
def my_func(param: mm["Param"]):
...
我收到 mypy 错误
error: Name "Param" is not defined [name-defined]
。
你知道我该如何解决这个问题吗?谷歌搜索和 ChatGPT 到目前为止没有帮助。
相关库正在创建这些类动态:
def _new_class(self, ...):
class TextXClass(metaclass=TextXMetaClass):
def __repr__(self): ...
cls = TextXClass
cls.__name__ = name
self._init_class(cls, ...)
return cls
它们是在闭包内创建的,并且仅作为
TextXMetaClass
本身的实例。因此不可能静态地引用它们。
TextX 的 Mypy 插件似乎也不存在,因此最好的选择是完全放弃静态类型检查。