帮助识别Python模块(预处理器?) "python -m dg

7 投票
4 回答
652 浏览
提问于 2025-04-17 02:02

在这张图片的背景中 image 你可以看到一些代码,看起来像是用一种扩展的Python方言写的。要把它处理成“正常”的Python代码,需要用“python -m dg”这个命令。谷歌上没有关于“python -m dg”的搜索结果,而yandex.ru上只有一页缓存,简要提到一个例子。

python  -m dg  <<< 'sum $ map int $ str 2 ** 1000'

这个似乎相当于

sum(map(int, str(2**1000)))

你知道这到底是怎么回事吗?我想看看这个工具,但找不到任何链接……

4 个回答

3

-m这个标志在使用python时是用来指定一个模块dg.py的。(你可以试试输入python -m this,这就相当于在python命令行中输入import this。)

看起来dg.py是一个用来解释某种自定义语言的工具。你图片的上半部分看起来像是用这种"dg"语言写的代码片段。它是在KDE环境下运行的,并且似乎使用了Qt库。不过我在网上找不到相关的信息。

4

真有趣——不过,正如其他回答所说,这是一种完全不为人知的语言。你是怎么在那张截图的背景中找到它的?我不得不在GIMP里调亮图片,才能明白你在说什么。

这个语言的语法有点像Python——它用__init__()来初始化对象,而且似乎有类似Python的for循环(不过这里好像只用在整数上?)——但它也借鉴了其他语言的很多特点:

  1. 像Ruby那样的doend来表示代码块的开始和结束。
  2. 从Smalltalk和Ruby中,方法的参数直接用空格分开,而不是用标点符号来分隔。
  3. 这个语言似乎无法处理a.b.c这种写法,尽管从1970年左右C语言发布以来,运算顺序都是从左到右的。相反,这个奇怪的语言让你必须写成{a.b}.c,除非我在这里误解了什么特殊情况。
  4. Lambda函数使用括号和箭头。
  5. 正则表达式在语法中有直接支持,使用r/.../的格式。

对于那些看不清图片的人,这里有一段代码片段,展示了以上五个特性(这些特性出现在大括号内的一层深处,我们看不到大括号的开始):

def __init__(self parent: nil) do
    {super}.__init__ parent;
    self.setLayout {QGridLayout};

    transform = (t) -> {r/([^>])\n/.sub '\]<br />' t};

    for c in (0 4) {self.layout}.setRowStretch    c 1;
    for c in (0 3) {self.layout}.setColumnStretch c 1;

    {self.layout}.addWidget {QLabel {transform self.text}} 1 1;
    {self.layout}.addLayout {
        sublayout = {QHBoxLayout};
        sublayout.addWidget {QLineEdit};
        sublayout.addWidget {QPushButton '<…Russian text…>'};
        return sublayout;
    } 2 1;
    {self.layout}.addWidget {QLabel {transform self.footer}} 3 1;
end;

我大胆猜测这个语言是直接编译成C++的,因为在这个漂亮的语法下,我看不到任何需要动态语言的东西。

4

dg是一种自定义语言,它可以转换成CPython 3.4(或更新版本)的字节码。

项目的GitHub链接是:https://github.com/pyos/dg

撰写回答