您的位置:首页 > 娱乐 > 明星 > 千万别自学软件编程_网站制作过程合理的步骤_网络推广公司_直通车关键词优化

千万别自学软件编程_网站制作过程合理的步骤_网络推广公司_直通车关键词优化

2025/1/16 11:10:05 来源:https://blog.csdn.net/m0_46829545/article/details/143214727  浏览:    关键词:千万别自学软件编程_网站制作过程合理的步骤_网络推广公司_直通车关键词优化
千万别自学软件编程_网站制作过程合理的步骤_网络推广公司_直通车关键词优化

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

## lexer.pyfrom 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.pydef _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 = rreturn freturn 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

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com