仓库源文

这几个星期继续重现由 Python 语法树生成木兰源码的功能(0.0.17.1 已发布在 PyPI,可通过 pip install ulang 安装):

如下 Python 代码:

class C1:
    class C2:
        def __init__(self):
            print(2)

    def __init__(self):
        print(1)
C1()
C1.C2()

可生成木兰源码:

type C1 {


  type C2 {

    func $C2() {
      println(2)
    }
  }

  func __init__(self) {
    println(1)
  }
}
C1()
C1.C2()

期间发现了一些费解之处。比如上面的第二个 __init__,为何不转换为 $C1 呢?

还有更明显的问题,比如对变长指名参数:

def a(**kwargs):
    print(kwargs)

a(k1="v1", k2="v2")

原始木兰可执行文件 转换时就会报错:

TypeError: can only concatenate str (not "arg") to str

又如属性方法:

class C:
    @property
    def m(self):
        print(0)

    @m.setter
    def m(self, value):
        print(1)

转换时也会报错:

NameError: name 'decorator_list' is not defined

这些问题都已在重现项目中原样复现,原因写在源码注释中。

综上,至此个人感觉此部分由 Python 生成木兰源码的功能的打磨程度不及语法解析部分。也许是因为此功能当时尚未在学校教学中大规模应用。

另外,为调试方便,添加了新命令行选项,用于显示源码的对应语法树。


附:代码量统计

主要部分的代码行数统计,格式为:上次->现在。