解析Python函数声明

2024-04-26 18:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

为了为我的Python代码编写一个自定义文档生成器,我想编写一个正则表达式,它能够匹配以下内容:

def my_function(arg1,arg2,arg3):
"""
DOC
"""

我当前的问题是,使用以下正则表达式:

^{pr2}$

我只能匹配my_functionarg2和{}(根据Pythex.org网站). 在

我不明白我做错了什么,因为我的(?:(\w+),)*应该匹配尽可能多的参数,直到最后一个(这里是arg3)。有人能解释一下吗?在

谢谢


Tags: 代码文档org参数doc网站mydef
1条回答
网友
1楼 · 发布于 2024-04-26 18:35:30

这在一般意义上是不可能的,因为Python函数不是正则表达式,它们可以采用正则表达式语法无法捕捉的形式,尤其是在其他Python结构的上下文中。但请振作起来,从你的问题中可以学到很多东西!在

有趣的是,尽管你说你在学习正则表达式,但你却意外地进入了计算机科学本身的核心,编译器理论!在

在这篇文章中,我将不到冰山一角的一小部分来帮助你开始,然后建议一些免费和付费的资源来帮助你继续。在

python函数本身可以有几种形式:

def foo(x):
    "docstring"
    <body>

def foo1(x):
    """doc
    string"""
    <body>

def foo2(x):
    <body>

此外,在之前和之后的函数可能不是另一个函数!在

这就是使用正则表达式本身不可能自动生成文档的原因(对我来说不可能。我没有足够的智慧去写一个正则表达式来解释整个Python语言。在

您需要研究的是解析(顺便说一下,我使用术语解析非常松散地涵盖parsing, tokenizing, and lexing只是为了保持事情“简单”),使用正则表达式通常是解析的一个非常重要的部分。在

一般的策略是将文件解析成语法结构。确定哪些结构是函数。隔离该函数的文本。然后可以使用正则表达式来解析该构造的文本。或者您可以进一步解析一个层次,并将函数分解为不同的语法结构函数名、参数声明、文档字符串、正文等。。。到那时你的问题就会解决了。在

我试图为一个标准函数定义(没有解析)编写一个正则表达式,比如foo或{},但即使我已经编写了一些语言,也很难做到这一点。在

简单地说,解析就是多行。Regex对单行线最有效。在

解析函数如下所示:

^{pr2}$

下面是真正的诀窍:这些parse函数都返回两个值:

0)解析的regex块 1) 剩下的部分

比如说

def parse_name(lines):
    pattern = 'def\s*?([a-zA-Z_][a-zA-Z0-9_]*?)'
    for line in lines:
        m = re.match(pattern, line)
        if m:
            res, rest = m.groups()
            return res, [rest] + lines
        else:
            raise Exception("Line cannot be parsed by parse_name: {}".format(line))

因此,一旦您隔离了函数文本(这是另一整套技巧,通常包括创建一个称为“语法”的东西不用担心,我用下面的一些资源为您设置),您可以使用以下技术解析函数文本:

def parse_fn(lines_of_text):
    name, rest = parse_name(lines_of_text)
    params, rest = parse_params(rest)
    doc_string, rest = parse_doc(rest)
    body, rest = parse_body(rest)
    function = [name, params, doc_string, body]
    res = function, rest
    return res

这个函数将返回一些表示函数的数据结构(我只是用了一个简单的list)和其余的文本行。这将被传递到适当地编录您的function数据,然后对文本的rest进行分类和处理!在

不管怎样,如果这是你感兴趣的事情,不要放弃!我想提出一些谦虚的建议:

1)从更容易解析的语言开始,比如Scheme/LISP。这些语言被设计成易于解析和操作!然后你就可以学习更多不规则的语言了。在

2a)彼得·诺维格(Peter Norvig)在这方面做了一些令人惊叹且非常容易理解的工作。退房Lispy!在

2b)peternorvig的课CS212(特别是第3单元code)非常具有挑战性,但在介绍基本语言设计概念方面做得非常出色。我得到的每一份工作,以及我对编程的热爱,都是因为那门课。在

3)如果你想让自己更进一步,而且你负担得起,我强烈建议你去看看戴夫·比泽利关于compilers或{a6}的研讨会。我从戴夫那里学了两门课,虽然我不能上体育课为了每个人,我的薪水每门课都翻了一番,所以我认为这是一项值得投资的投资。在

4)绝对检查计算机程序(向导书)和编译器(龙书)的结构和解释。他们会改变你的生活。在

5)不要放弃!你明白了!!祝你好运!在

相关问题 更多 >