python装饰器的另类用法

news2024/11/27 12:38:06

在对pyverilog源码进行单步调试时,遇到一个很奇怪的现象,被装饰器装饰的方法t_LINECOMMENT没有主动调用,但装饰器TOKEN中的内嵌函数set_regex却被调用了。

## lexer.py

from ply.lex import *


class VerilogLexer(object):
    linecomment = r"""//.*?\n"""

    @TOKEN(linecomment)
    def t_LINECOMMENT(self, t):
        t.lexer.lineno += t.value.count("\n")
        pass
## lex.py

def _get_regex(func):
    return getattr(func, 'regex', func.__doc__)

def TOKEN(r):
    def set_regex(f):
        if hasattr(r, '__call__'):
            f.regex = _get_regex(r)
        else:
            f.regex = r
        return f
    return set_regex

原因就在于装饰器TOKEN是带参数的。先执行TOKEN(linecomment)函数调用,返回set_regex对象,@TOKEN(linecomment)就变成@set_regex,这是一个新的装饰器,装饰t_LINECOMMENT,接着执行set_regex(t_LINECOMMENT),返回f对象,这里f对象就是t_LINECOMMENT,不是新创建的对象。这样就偷偷执行了set_regex方法。

@TOKEN(linecomment)
    def t_LINECOMMENT(self, t):pass

## 上面的代码等价于下面的代码

def t_LINECOMMENT(self, t):pass
t_LINECOMMENT = TOKEN(linecomment)(t_LINECOMMENT)

这种装饰器的用法可用于为函数增加属性: 

PEP 318 – Decorators for Functions and Methods | peps.python.org

Examples

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++【string类的使用】(上)

文章目录 1. 为什么要学习string类2. 标准库的string类2.1 string的构造函数(1)无参构造(重点)(2)用字符串初始化(重点)(3)用字符串的前n个字符初始化(4)拷贝…

常见ElasticSearch 面试题解析(上)

前言 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch…

直播间“饕餮盛宴”的背后,是“他经济”正在冒头

最近,一个有意思的现象逐渐露出了苗头。 今年“双11”第一轮尾款开启支付的当晚,罗永浩的直播间上演了一出别样的“饕餮盛宴”。直播开场后,iphone16系列、可口可乐(含糖、无糖300ml)10秒售罄,索尼PS5、沃…

hive on tez 指定队列后任务一直处于running状态

如上图所示一直处于running状态&#xff0c;查看日志发现一直重复弹出同一个info&#xff1a; 2024-10-18 16:57:32,739 [INFO] [AMRM Callback Handler Thread] |rm.YarnTaskSchedulerService|: Allocated: <memory:0, vCores:0> 释义: 当前应用程序没有分配到任何内存…

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

教程分享!超简单的低功耗4G模组LCD应用示例!看过来~

低功耗4G模组LCD应用是物联网技术中的一部分知识&#xff0c;在未来的学习和实践中&#xff0c;我们还将接触到更多前沿的技术和理念。让我们一起努力&#xff0c;探索科技的无限可能&#xff0c;为我们的生活带来更多便利与惊喜&#xff01;希望本文能为您提供一些帮助&#x…

Cisco WLC 9800 - HA SSO with Ether-channel

本文将记录如何配置HA SSO以及Ethernet Channel。 1.拓扑情况 本文的内容基于如下的Topo进行。 2.准备工作 两台WLC的型号必须一样&#xff1b;两台WLC必须使用一样的软件版本&#xff1b;需要准备好使用的IP地址&#xff1a;两个用于WLC的管理地址&#xff08;WMI&#xff…

串口通讯编程示例之串口编写程序

使用open()函数打开串口设备 首先使用open()函数打开串口设备/dev/ttymxc6&#xff0c;设备使用了O_RDWR | O_NOCTTY | O_NDELAY标志&#xff0c;分别代表以读写方式打开、不让设备成为控制终端且设置非阻塞模式&#xff0c;也就是当无法打开设备时&#xff0c;不会在原地等待&…

【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 &#xff1a;【Unity实战笔记】第二一 基于状态模式的角色控制——以UnityChan为例 发现出现角色抖动问题 尝试解决方法&#xff1a; 跳跃的loop time不要勾选&#xff1b; 相机aim添加垂直阻尼 还是不行&#xff0c;仔细查看是位移时震颤。 UnityCha…

HCIP-HarmonyOS Application Developer 习题(十三)

&#xff08;多选&#xff09;1、在设计应用框架的过程中&#xff0c;我们常用的界面应用框架有哪些? A、启动页 B、详情页 C、列表视图 D、网格视图 答案&#xff1a;ABCD 分析&#xff1a; &#xff08;多选&#xff09;2、触摸屏以触控的方式进行输入。它可以支持以下哪些…

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

千万不要小看SD3.5!最强模型全家桶来了!

一、SD3.5 的登场 Stability AI 推出的 SD3.5 引起了广泛关注。它直接开源了三个模型&#xff0c;包括 Large 和 Large Turbo&#xff0c;Medium 将于 29 号发布&#xff0c;并且这三个型号都可以商用。 &#xff08;一&#xff09;模型版本介绍 模型版本参数量特点分辨率范围S…

《A complete telomere-to-telomere assembly of the maize genome》方法总结

研究背景 完整的T2T基因组组装一直是基因组研究的长期追求。 研究方法 通过生成高深度覆盖的超长 Oxford Nanopore Technology (ONT) 和 PacBio HiFi 测序数据&#xff0c;报道了玉米的完整基因组组装。 每条染色体均以单一contig的形式完整覆盖。 结果概述 基因组特征&am…

vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?

在 Vue 中&#xff0c;Mitt 和 Pinia 是两个不同的工具&#xff0c;它们的主要用途和功能有所不同&#xff0c;但在某些方面也存在重合的部分。 区别 Mitt&#xff1a; Mitt 是一个简单而强大的事件总线库&#xff0c;用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…

【Linux】实现一个简易的shell命令行

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit) 目录 一.项目简介 二.分析项目实现 三.逐步实现项目功能 1.获取命令行 2.解析命令行 3.指令的判断 4.普通命令的执行 四.完整项目代码 结语 一.项目简介…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中&#xff0c;反思自己计算生物学基础非常薄弱&#xff0c;然而作为一门非常新兴的交叉学科&#xff0c;涉及计算机、物理、生物、数学等多多学科&#xff0c;国内并没有这样完善的教程&#xff0c;因此想要自己做一个教程&#xff0c;使用费曼学习法学习&#xff0c;…

【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus

文章目录 一、先决条件1.1 安装AWS CLI ✅1.2 安装 EKS 相关工具✅1.3 创建 Amazon S3 存储桶✅1.4 创建 Amazon MSK 实例✅ 二、创建EKS集群三、创建 ebs-sc StorageClass四、安装 AWS Load Balancer Controller五、部署 Milvus 数据库5.1 添加 Milvus Helm 仓库5.2 配置 S3 作…

Vue2、Element中实现Enter模拟Tab,实现切换下一个框的效果

目录 &#x1f4c3;前序 &#x1f449;开发历程 &#x1f4bb;实际代码 &#x1f4fd;实现效果图 前序 在几乎所有的浏览器中&#xff0c;都具备通过 Tab 键来切换焦点的功能。然而&#xff0c;有些用户提出了强烈要求&#xff0c;希望能够增加通过 Enter 键…

进程间通信(二)消息队列、共享内存、信号量

文章目录 进程间通信System V IPC概述System V IPC 对象的访问消息队列示例--使用消息队列实现进程间的通信 共享内存示例--使用共享内存实现父子进程间的通信&#xff08;进程同步&#xff09;示例--使用进程实现之前的ATM案例&#xff08;进程互斥&#xff09; 信号量示例--利…

上传Gitee仓库流程图

推荐一个流程图工具 登录 | ProcessOnProcessOn是一个在线协作绘图平台&#xff0c;为用户提供强大、易用的作图工具&#xff01;支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同时依托于互联网实现了人与人之间的…