当前位置: 首页 > news >正文

TypeError:未绑定方法

TypeError: unbound method 错误通常发生在类方法被调用时,但没有正确绑定到实例。这通常意味着你试图在类本身上调用一个实例方法,或者没有使用正确的方式创建类实例。

在这里插入图片描述

1、问题背景

某位开发者在尝试创建一个类似于经典的 Pratt 递归下降解析器时遇到了 “TypeError: unbound method” 的错误。在简化了代码之后,开发者发现问题出在对中缀运算符的处理上,具体来说是 infix_led 函数没有正确绑定到 symbol 类的实例。

2、解决方案:

有两种解决方案:

方法1:
tokenize() 函数中,每当遇到一个非数字的运算符时,不直接生成一个 symbol 类,而是生成一个 symbol() 的实例。这确保了每个运算符都有一个单独的实例,可以绑定各自的 led 函数。

方法2:
使用 types.MethodType 函数将 infix_led 函数绑定到 symbol 类的实例上。这是一种更显式的绑定方式,也确保了每个运算符都有一个单独的实例,可以绑定各自的 led 函数。

代码示例:

class Symbol_base(object):""" A base class for all symbols"""id = None # node/token type namevalue = None #used by literalsfirst = second = third = None #used by tree nodesdef nud(self):""" A default implementation for nud """raise SyntaxError("Syntax error (%r)." % self.id)def led(self,left):""" A default implementation for led """raise SyntaxError("Unknown operator (%r)." % self.id)def __repr__(self):if self.id == "(name)" or self.id == "(literal)":return "(%s %s)" % (self.id[1:-1], self.value)out = [self.id, self.first, self.second, self.third]out = map(str, filter(None,out))return "(" + " ".join(out) + ")"symbol_table = {}
def symbol(id, bindingpower=0):""" If a given symbol is found in the symbol_table return it.If the symblo cannot be found theni create the appropriate classand add that to the symbol_table."""try:s = symbol_table[id]except KeyError:class s(Symbol_base):passs.__name__ = "symbol:" + id #for debugging purposess.id = ids.lbp = bindingpowersymbol_table[id] = selse:s.lbp = max(bindingpower,s.lbp)return sdef infix(id, bp):""" Helper function for defining the symbols for infix operations """def infix_led(self, left):self.first = leftself.second = expression(bp)return selfsymbol(id, bp).led = infix_led#define all the symbols
infix("+", 10)
symbol("(literal)").nud = lambda self: self #literal values must return the symbol itself
symbol("(end)")token_pat = re.compile("\s*(?:(\d+)|(.))")def tokenize(program):for number, operator in token_pat.findall(program):if number:symbol = symbol_table["(literal)"]s = symbol()s.value = numberyield selse:symbol = symbol_table.get(operator)if not symbol:raise SyntaxError("Unknown operator")yield symbol()symbol = symbol_table["(end)"]yield symbol()def expression(rbp = 0):global tokent = tokentoken = next()left = t.nud()while rbp < token.lbp:t = tokentoken = next()left = t.led(left)return leftdef parse(program):global token, nextnext = tokenize(program).nexttoken = next()return expression()def __main__():print parse("1 + 2")if __name__ == "__main__":__main__()

在这个代码示例中,tokenize() 函数生成 Symbol_base 类的实例,并且使用 types.MethodType() 函数将 infix_led 函数绑定到每个实例上。这样就确保了每个运算符都有一个单独的实例,并且他们的 led 函数都正确绑定到了各自的实例上。

如果你遇到 TypeError: unbound method 错误,请确保你正确地实例化类,并通过实例调用方法。如果确实需要通过类调用方法,请使用 @classmethod@staticmethod 装饰器。

希望这个解释和解决方案对你有所帮助。

相关文章:

TypeError:未绑定方法

TypeError: unbound method 错误通常发生在类方法被调用时&#xff0c;但没有正确绑定到实例。这通常意味着你试图在类本身上调用一个实例方法&#xff0c;或者没有使用正确的方式创建类实例。 1、问题背景 某位开发者在尝试创建一个类似于经典的 Pratt 递归下降解析器时遇到了…...

Java虚拟机(JVM)的架构和工作原理,字节码执行流程

JVM的概念 JVM是Java Virtual Machine的缩写&#xff0c; 即Java虚拟机&#xff0c;也被称为Java程序运行的核心环境 。它是一种用于计算设备的规范&#xff0c;‌通过在实际的计算机上仿真模拟各种计算机功能来实现。‌JVM由一套字节码指令集、‌一组寄存器、‌一个栈、‌一个…...

416.分割等和子集

416.分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和…...

python初始化一个三维数组

文章目录 1.什么是三维数组2.那我应该如何初始化一个自定义长度的三维数组呢&#xff1f; 1.什么是三维数组 从最外层开始理解&#xff0c;可以理解为一维数组&#xff0c;里面套了一个二维数组&#xff08;12等于三维数组&#xff09; arr [ [[], []], [[], [], []], [[],[]]…...

EI会议推荐-第二届大数据与数据挖掘国际会议(BDDM 2024)

第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xff09; 1、基本信息 大会官网&#xff1a;http://www.icbddm.org/ 官方邮箱&#xff1a;icbddm163.com 主办方&#xff1a;武汉纺织大学 会议时间&#xff1a;2024年12月13日-12月15日 会议地点&#xff1a;湖…...

RK3566/RK3568 Android 11 动态显示/隐藏下拉框

概述 在系统服务中增加显示/隐藏状态栏方法,在上层app动态调用显示/隐藏下拉框方法,设备关机和重启后也能继续生效。 创建全局变量 1.定义全局变量 在frameworks/base/core/java/android/provider/Settings.java中添加 /*** Disable drop-down box* @hide*/public static…...

Android图片缓存工具类LruCache原理和使用介绍

LruCache & DiskLruCache原理。 常用的三级缓存主要有LruCache、DiskLruCache、网络&#xff0c;其中LruCache对应内存缓存、 DiskLruCache对应持久化缓存。Lru表示最近最少使用&#xff0c;意思是当缓存到达限制时候&#xff0c;优先淘汰近 期内最少使用的缓存&#xff0c…...

生活杂记1

生命中&#xff0c;总有一些事需要你一生去治愈&#xff0c;我把这些杂记写出来&#xff0c;写完了就不再想了&#xff0c;太内耗了…hahaha~ 因为嘴馋&#xff0c;小时候经常去老姑家&#xff0c;她家有各类零食及平时很少吃的“山珍海味”。去的次数多了&#xff0c;就和她家…...

go常用代码

连接阿波罗&#xff1a; 默认properties类型 package mainimport ("fmt""github.com/apolloconfig/agollo/v4""github.com/apolloconfig/agollo/v4/env/config" )func main() {c : &config.AppConfig{AppID: "2222",Cl…...

各种各样的正则表达式

一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 正…...

WebRTC 基础

WebRTC 基础 目录 什么是 WebRTCWebRTC 的基本概念WebRTC 的基本流程 连接建立流程图 WebRTC 的基本对象 RTCPeerConnectionRTCSessionDescriptionRTCIceCandidate WebRTC API 详解 RTCPeerConnection API媒体流 API 详细的代码示例 基本连接示例完整的 WebRTC 实现示例 总结…...

半天攻略:用ChatGPT快速搞定高质量论文,从选题到完稿一站式指南!

在学术论文的撰写过程中&#xff0c;ChatGPT可以作为一个强大的辅助工具&#xff0c;帮助完成从确定主题到整理参考文献的各个环节。接下来&#xff0c;我们将详细介绍如何利用ChatGPT提升论文写作的效率和质量。 确定论文主题 初步探索&#xff1a;通过ChatGPT探索主题&#…...

探索PDF的奥秘:pdfrw库的神奇之旅

文章目录 探索PDF的奥秘&#xff1a;pdfrw库的神奇之旅背景&#xff1a;为何选择pdfrw&#xff1f;pdfrw是什么&#xff1f;如何安装pdfrw&#xff1f;五个简单的库函数使用方法场景应用&#xff1a;pdfrw在实际工作中的应用常见问题与解决方案总结 探索PDF的奥秘&#xff1a;p…...

修改jupyter notebook 默认浏览器(不动配置文件,改系统默认浏览器)

最开始把联想浏览器切到EDGE就是用的修改系统的默认浏览器。不知怎么的现在搜到的方法都是在说修改配置文件&#x1f613;。 不想动配置文件&#xff0c;平时对默认浏览器没有特殊要求的&#xff0c;可以用这个方法。 这里是把默认浏览器改成联想浏览器&#xff0c;电脑也是联…...

一个基于共享内存的内存数据库:1 介绍

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

可视化编程 制作在线点名程序,人工和随机生成两种模式

以下是对这段代码的分析: 一、功能概述 这是一个使用 Python 的 Tkinter 库创建的图形用户界面(GUI)应用程序,主要功能是进行在线点名和随机抽奖。可以模拟在一个有六排六列座位布局的场景中进行点名操作和不同规模的随机抽奖。 二、主要函数和变量 窗口设置和变量初始化:…...

pdb在CDB间搬迁 dblink 与rman

create pluggable database <pdb_name> from <pdb_name><dblink> relocate availability max create_file_destxxxxx;-----改变目录 How to relocate a PDB from one CDB to another with minimal down time -12.2 Release (Doc ID 2396518.1) GOAL How to …...

Linux系统中的fork与vfork的区别

目录 一、引言 二、fork与vfork的基本概念 1.fork() 2.vfork() 三、fork与vfork的区别 1.内存分配策略 2.执行顺序 3.性能 4.安全性 四、总结 本文将详细介绍Linux系统中fork与vfork这两个系统调用的区别&#xff0c;帮助读者更好地理解它们在实际编程中的应用。 一、引言…...

特殊类的设计和类型转换

文章目录 特殊类1.请设计一个类&#xff0c;不能被拷贝2. 请设计一个类&#xff0c;只能在堆上创建对象3. 请设计一个类&#xff0c;只能在栈上创建对象 &#xff08;★&#xff09;4. 请设计一个类&#xff0c;不能被继承5. 请设计一个类&#xff0c;只能创建一个对象(单例模式…...

ES模块导入、导出学习笔记

ES模块导入、导出学习笔记 1、命名导出、导入1.1、声明时直接导出1.2、先声明&#xff0c;再导出 2、默认导出2.1、声明时直接导出2.2、先声明&#xff0c;再导出 3、命名导出 VS 默认导出3.1、命名导出3.2、默认导出3.3、同时使用 4、使用 as 关键字4.1、在 import 中使用 as4…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...