Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >用Python编写解释器。实例被认为是有害的吗?

用Python编写解释器。实例被认为是有害的吗?
EN

Stack Overflow用户
提问于 2009-09-04 14:45:14
回答 7查看 2K关注 0票数 4

我正在将我创建的领域特定语言的解释器从Scala移植到Python。在这个过程中,我试图找到一种方法来模仿我广泛使用的Scala的case类特性。最后,我求助于使用isinstance,但留下的感觉是我可能遗漏了什么。

this one这样抨击isinstance使用的文章让我想知道是否有更好的方法来解决我的问题,而不涉及一些根本性的重写。

我构建了许多Python类,每个类表示一种不同类型的抽象语法树节点,例如For、While、Break、Return、Statement等

Scala允许像这样处理运算符求值:

代码语言:javascript
代码运行次数:0
复制
case EOp("==",EInt(l),EInt(r)) => EBool(l==r)
case EOp("==",EBool(l),EBool(r)) => EBool(l==r)

到目前为止,为了移植到Python,我广泛地使用了elif块和isinstance调用来达到同样的效果,更加冗长和非Python风格。有没有更好的方法?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-07 08:04:00

总结:这是编写编译器的常用方法,在这里很好。

在其他语言中,处理此问题的一种非常常见的方法是“模式匹配”,这正是您所描述的。我希望这就是Scala中case语句的名称。这是编写编程语言实现和工具的一个非常常见的习惯用法:编译器、解释器等。为什么它这么好?因为实现与数据完全分离(这通常是不好的,但在编译器中通常是可取的)。

因此,问题是这种编程语言实现的通用习惯用法是Python中的反模式。啊哦。正如你可能知道的,这与其说是语言问题,不如说是一个政治问题。如果其他Pythonistas看到代码,他们会尖叫;如果其他语言实现者看到它,他们会立即理解它。

这在Python中是反模式的原因是因为Python鼓励鸭型接口:您不应该有基于类型的行为,而应该由对象在运行时可用的方法来定义它们。如果您希望S. Lott's answer成为惯用的Python,那么它可以很好地工作,但是它添加的东西很少。

我怀疑您的设计并不是真正的鸭子类型--毕竟它是一个编译器,并且使用名称和静态结构定义的类非常常见。如果您愿意,您可以认为您的对象有一个“类型”字段,isinstance用于基于该类型进行模式匹配。

附件:

模式匹配可能是人们喜欢用函数式语言编写编译器等的首要原因。

票数 2
EN

Stack Overflow用户

发布于 2009-09-04 15:22:44

是。

只需使用Polymorphism,而不是实例。这更简单。

代码语言:javascript
代码运行次数:0
复制
class Node( object ):
    def eval( self, context ):
        raise NotImplementedError

class Add( object ):
    def eval( self, context ):
        return self.arg1.eval( context ) + self.arg2.eval( context )

这种方式非常简单,而且不需要isinstance

像这样的需要强制的东西怎么样?

代码语言:javascript
代码运行次数:0
复制
Add( Double(this), Integer(that) )

这仍然是一个多态问题。

代码语言:javascript
代码运行次数:0
复制
class MyType( object ):
    rank= None
    def coerce( self, another ):
        return NotImplemented

class Double( object ):
    rank = 2
    def coerce( self, another ):
        return another.toDouble()
    def toDouble( self ):
        return self
    def toInteger( self ):
        return int(self)

class Integer( object ):
    rank = 1
    def coerce( self, another ):
        return another.toInteger() 
    def toDouble( self ):
        return float(self)
    def toInteger( self ): 
        return self

 class Operation( Node ):
    def conform( self, another ):
        if self.rank > another.rank:
            this, that = self, self.coerce( another )
        else:
            this, that = another.coerce( self ), another
        return this, that
    def add( self, another ):
        this, that = self.coerce( another )
        return this + that
票数 2
EN

Stack Overflow用户

发布于 2009-09-05 17:15:23

在python中有一条经验法则,如果您发现自己编写了一大块if/elif语句,具有类似的条件(一堆isinstance(...)例如),那么你可能以错误的方式解决了问题。

更好的方法包括使用类和多态性,访问者模式,dict查找,等等。在你的例子中,为不同的类型创建一个具有重载的operator类可以工作(如上所述),所以使用(type,operator)项的dict也可以。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1381845

复制
相关文章
Java系列 | 属性依赖注入被认为是有害的
在依赖注入框架中,字段注入是一种非常流行的做法,例如Spring。然而,它有几个严重的权衡因素,一般来说应该避免。
Tinywan
2023/03/08
7430
Java系列 | 属性依赖注入被认为是有害的
大神用Python编写虚拟机解释器
群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流 环境介绍 环境采用带桌面的Ubuntu Linux环境, LX终端(LXTerminal):Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 环境使用 众所周知,python语言作为一门超级人性化的语言越来越被受到重视。虚拟服务同样受到人们的重视,那么本次项目的目的就是让大家学会使用python制作一个虚
企鹅号小编
2018/01/12
8610
大神用Python编写虚拟机解释器
如何用Python编写一个Lisp解释器
这篇文章有两个目的:一是展示如何实现一个计算机语言的解释器,二是演示如何使用 Python 3 构造 Lisp 的一种方言 Schema,作者把自己的这个语言解释器称作 Lispy。几年前,作者曾展示过如何用 Java 和 Common Lisp 写 Schema 解释器。而本次的目的很纯粹,作者会尽可能简明扼要为大家进行介绍。
AI科技大本营
2019/08/15
1.4K0
如何用Python编写一个Lisp解释器
Unix 是用 C 语言编写的吗?
Unix 确实是用 C 语言编写的,而且是世界上第一个用 C 语言编写的操作系统。但是 Unix 是怎么产生的?C 语言又是怎么产生的?Unix 为什么要用 C 语言来编写?相信看完这篇文章你很快就会有了答案。
Coding十日谈
2020/08/13
4.8K0
Unix 是用 C 语言编写的吗?
python解释器找不到_python解释器路径
暑假放假两周,两周没写代码,打开PyCharm发现解释器找不到了(Python Interpreter Nothing to show),程序自然也无法运行,如图:
全栈程序员站长
2022/09/26
1.7K0
python解释器找不到_python解释器路径
python解释器与编译器_pycharm python解释器
什么是Python?Python的起源和发展。Python的优势。
全栈程序员站长
2022/09/27
1.2K0
python解释器与编译器_pycharm python解释器
用python解释mapreduce
map import sys #输入为标准输出stdin for line in sys.stdin: #删除开头和结尾的空行 line = line.strip() #以默认空格分隔单词到words列表 words = line.split() for word in words: #输出所有单词,格式为“单词,1”以便为reduce的输入 print '%s %s' % (word,1) reduce import sys cur
零月
2018/04/25
7130
用python解释mapreduce
pycharm配置python解释器的问题_python解释器的提示符
转载自: https://blog.csdn.net/weixin_37861326/article/details/80327503
全栈程序员站长
2022/09/28
9150
pycharm配置python解释器的问题_python解释器的提示符
Python写的Python解释器(五)
条件和循环 到目前为止,解释器仅仅只是简单的逐个执行指令。下面将会讲述需要多次执行某些指令,或者在特定条件下跳过它们的做法。在代码中编写循环和if语句时,解释器必须能够在指令进行跳转。Python在字节码中用GOTO语句处理循环和条件语句。再看一下函数cond的反汇编:
哒呵呵
2018/08/06
8660
Python写的Python解释器(一)
导论 Byterun是一个用Python实现的Python解释器。它的结构类似于CPython(Python的主流实现方式)。
哒呵呵
2018/08/06
1.5K0
Python写的Python解释器(六)
目前可以确认Python虚拟机是一个堆栈机器。它通过指令来控制执行顺序,推入和弹出堆栈的值。在上面的例子中,最后一条指令是RETURN_VALUE,它对应于代码中的return语句。但指令返回到哪里呢?
哒呵呵
2018/08/06
5300
手机python 3.8解释器_Python 3.8 解释器安装教程
Python是一个门面向对象的解释型编程语言,如果要完成Python程序的开发,需要有Python解释器的支持,所以首先需要配置好Python解释器(本教程选择最新的 Python 3.8.3 版本),没有安装的小伙伴,可以跟着一起操作哦。
全栈程序员站长
2022/09/15
1.2K0
Python写的Python解释器(二)
玩具解释器 首先从一个玩具解释器开始,这个微型解释器只能做加法,而且值包含了三个指令,这三个指令是:
哒呵呵
2018/08/06
6520
Python写的Python解释器(三)
变量 接下来,给解释器添加变量。 变量需要一条指令来存储变量的值,STORE_NAME; 一条检索它的指令,LOAD_NAME; 以及变量名称到值的映射。 目前,先忽略命名空间和范围,将变量映射存储在解释器对象本身上。 最后,除了常量列表之外,我们必须确保what_to_execute具有变量名称列表。
哒呵呵
2018/08/06
5460
Python写的Python解释器(四)
真正的Python字节码 现在让进入真正的Python字节码中,从一个简单的函数开始:
哒呵呵
2018/08/06
5980
python GIL解释器
全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时刻仅有一个线程在执行。常见例子有CPython(JPython不使用GIL)与Ruby MRI。
云深无际
2021/04/14
1.1K0
python GIL解释器
python解释器详解
操作系统位于计算机硬件与应用软件之间是一个协调、管理、控制计算机硬件资源与软件资源的控制程序。操作系统的功能为:控制硬件、把对硬件复杂的操作封装成优美简单的接口(文件),给用户或者应用程序去使用。我们以后开发的都是应用程序,应用程序无法直接操作硬件,但凡要操作硬件,都是调用操作系统的接口。
狼啸风云
2019/01/18
3.8K0
用 Antlr 重构脚本解释器
在上一个版本实现的脚本解释器 GScript 中实现了基本的四则运算以及 AST 的生成。
crossoverJie
2022/10/27
7870
用 Antlr 重构脚本解释器
设置pycharm的python解释器_pycharm安装后无解释器
弹出下图界面,选择左边红色圈,Project Python -> Project Interpreter
全栈程序员站长
2022/09/27
1.1K0
设置pycharm的python解释器_pycharm安装后无解释器
点击加载更多

相似问题

局部方法被认为是有害的吗?

60

使用getApplicationContext()被认为是有害的吗?

24

被认为是有害的?

21

迭代器的副作用被认为是有害的吗?

90

继续被认为是有害的?

171
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文