`
huangyiiiiii
  • 浏览: 120963 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

意外收获:get_caller

F# 
阅读更多
阅读 PLY 的 lex.py 的时候,看到这么一段代码 (line:449):
try:
raise RuntimeError
except RuntimeError:
e,b,t = sys.exc_info()
f = t.tb_frame
f = f.f_back # Walk out to our calling function
ldict = f.f_globals # Grab its globals dictionary
哈哈,这种用法还真是前所未见(也许是见识还不够吧)!自己抛出异常自己捕捉,然后就可以访问到 frame stack 了!那还不无法无天了啊,呵呵。

你可以在这个 frame stack 中前后移动,这样你可以获得调用者的信息:比如 f_globals、f_locals、f_builtins、f_code 等,你还可以获得调用者的调用者的信息,你还可以获得 ... 。

而且获得了调用者的字节码( f_code )之后,你还可以直接把它再执行一遍!
import sys

count = 0

def get_caller():
global count
try:
raise RuntimeError
except RuntimeError:
e,b,t = sys.exc_info()
f = t.tb_frame
f = f.f_back
count += 1
print count
eval(f.f_code, f.f_globals, f.f_locals)

def caller():
get_caller()

if __name__=='__main__':
caller()
大家还有什么变态的想法,尽管留言哈 ^_^ .


另外,查看 sys.exc_info 的文档时候,看到有一个警告,大意是说 sys.exc_info() 返回的那个 traceback 对象( 返回的 tuple 中第三个),最好不要赋值给当前捕捉到异常的这个函数的局部变量,如果你不需要用到 traceback 对象的话可以这么干:
exctype, value = sys.exc_info()[:2]
如果你确实需要使用这个对象,那你最好用完后 delete 掉这个变量,或者在另外开一个函数来调用 sys.exc_info()。
理由是将 traceback 对象赋值给当前函数的局部变量会产生引用循环,而这个东西是引用计数垃圾回收方式的软肋,python2.2 以前的版本它直接就会导致内存泄露了,虽然随后版本的gc能搞定引用循环问题,不过考虑到效率,最好还是不要创建引用循环了。
分享到:
评论

相关推荐

    PyPI 官网下载 | pthr_db_caller-0.0.11.tar.gz

    《PyPI官网下载:深入解析.pthr_db_caller-0.0.11.tar.gz》 在Python的世界中,PyPI(Python Package Index)是最重要的软件仓库,它为开发者提供了无数的开源库和模块,方便他们构建自己的项目。本文将详细解析...

    best_errors:Better_errors 和 binding_of_caller

    是否厌倦了为每个Rails 项目在 Gemfile 中同时要求better_errors和binding_of_caller而使您的手指陷入僵局? 那么这颗宝石是给你的!安装把它放在你的 Gemfile 中并打包: gem 'best_errors'什么是 ? 它是 Rails ...

    CI.zip_8051 caller id_8051 pcb_The Chip_caller id_caller id 8051

    This is the Ready project caller Id based on the Atmel Chip 8051... PCB layout is also given in this file

    pg_sql_caller:ActiveRecord的Postgresql Sql调用程序

    gem 'pg_sql_caller' 然后执行: $ bundle install 或自己安装为: $ gem install pg_sql_caller 用法 从PgSqlCaller::Base创建子类并PgSqlCaller::Base定义model_class require 'pg_sql_caller' class ...

    binding_of_caller, 在 MRI 1.9.2 中,检索方法调用方的绑定.zip

    binding_of_caller, 在 MRI 1.9.2 中,检索方法调用方的绑定 binding_of_caller( C ) Mair ( banisterfiend ) 2012检索 MRI (> = 1.9.2 ) 和 RBX ( Rubinius )的方法调用方的绑定。binding_of_

    dll_caller:一个windows dll调用hellper

    dll_caller 一个windows dll调用hellper Windows 消息框示例 package main import ( "github.com/gogap/dll_caller" "fmt" ) func main (){ ShowMessageBox () } func ShowMessageBox () { var dll * dll_...

    Caller-Id-DTMF.rar_caller id_full

    标题中的"Caller-Id-DTMF.rar_caller id_full"提到了电话的呼叫者ID(Caller ID)和双音多频(DTMF)技术。这是一个关于这两种通信技术的详细资料包。呼叫者ID允许接收方在电话响起时知道来电者的身份,而DTMF则是...

    abc.rar_ABC_caller id_cndmain.ocx_ocx控件_来电显示

    标题中的"abc.rar_ABC_caller id_cndmain.ocx_ocx控件_来电显示"揭示了这个压缩包的内容,主要是一个名为"abc"的软件或工具,它包含了一个用于来电显示功能的OCX(ActiveX Control)控件,具体为"cndmain.ocx"。...

    app_DTMF_decoder.rar_caller id_来电显示

    标题中的"app_DTMF_decoder.rar_caller id_来电显示"揭示了这个压缩包文件包含一个应用程序,专门用于DTMF(双音多频)解码,并且与来电显示功能相关,特别是针对caller id的处理。DTMF是一种在电话通信中广泛使用的...

    CID.rar_CID_PIC16F690_caller id_辨識_電話

    标题中的"CID.rar CID_PIC16F690_caller id_辨識_電話"表明这是一个关于使用PIC16F690微控制器实现来电显示(CID,Caller ID)功能的项目。PIC16F690是Microchip Technology公司生产的8位微控制器,常用于小型嵌入式...

    pino-caller::evergreen_tree:包括pino日志消息的呼叫站点

    pino-caller为包装这增加了每个日志消息的调用位置到日志输出。 这在使用大型代码库进行开发时很有用,以便找到调用pino的确切位置。 安装 对于Pino v4及以下版本,请使用v2行,可以使用@legacy标签安装该@legacy :...

    softap_ap6212a0_tinav2.1_验证通过_旧版本的系统_20170915_1223没有外层目录.7z

    旧版本版本的全志R16平台的tinav2.1的系统打开softAP 2017/9/14 17:25 版本:V1.0 1、原始编译: ...rootroot@cm-System-Product-Name:~$ cd /home/wwt/ ...rootroot@cm-System-Product-Name:/home/wwt$ tar zxvf...

    get-caller:get caller 的演示在 node v0.12 中不起作用

    在JavaScript的世界里,`get-caller`通常是指获取调用栈中上一层函数的信息,这在调试、日志记录或实现特定逻辑时非常有用。然而,根据提供的标题和描述,似乎在Node.js v0.12版本中,一个名为`get-caller`的功能或...

    Freeswitchivr外呼接口

    - 这些按键的意图可以通过GET方法的 `/outbound/get/{uuid}` 接口获取,其中`{uuid}`是通话的唯一标识符。 - 接口返回的数据包括`uuid`、`calledNumber`(被叫号码)、`purpose`(按键意图)和`time`(通话开始...

    DTMF_CallerID.rar_DTMF C.id_dtmf caller

    标题中的"DTMF_CallerID.rar_DTMF C.id_dtmf caller"表明这是一个与DTMF(双音多频)技术以及来电显示相关的压缩文件,主要用于解析和展示主叫方的电话号码。DTMF是一种广泛使用的电话信号传输方式,允许用户通过...

    stdcall与 cdecl

    - **cdecl (Caller-Destructor)**:此调用约定是C语言和大多数C++函数使用的默认约定。在cdecl中,参数是从右到左压入栈中的,并且由调用者负责清理栈空间。 - **stdcall (Standard-Call)**:此调用约定通常用于...

    activerecord-commentator:将caller_location(文件名,行号和方法名)添加为SQL注释

    ActiveRecord :: Commentator将caller_location (文件名,行号和方法名)添加为调用SQL语句SQL注释。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-commentator' 然后执行: $ bundle 或将...

    Freeswitch外呼群呼接口

    4. `origination_caller_id_number`: 主叫号码,必须是有效的电话号码,用于显示给被叫方。 在`originate`对象后面,通常会指定被叫号码,如`sofia/gateway/bjgw/135020*****`,其中`bjgw`代表北京的网关,`135020*...

    ssf_DTS_caller:基于尺度空间过滤的 CNV 调用和基因分型

    #ssf_DTS_caller ssf_DTS_caller 是一个用于从读取深度照明数据中调用 CNV 的包。 该包有许多依赖项,包括 DenseTrackSets 和 DTS 基因型文件。 它还包含 genotype_regions,一个用于获取一组区域的基因型的简单...

Global site tag (gtag.js) - Google Analytics