textx 模型的类型检查

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

我正在尝试使用 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 到目前为止没有帮助。

python python-typing mypy textx
1个回答
0
投票

相关库正在创建这些类动态

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 插件似乎也不存在,因此最好的选择是完全放弃静态类型检查。

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