设为首页 收藏本站
查看: 2261|回复: 0

[经验分享] Python programming with goto

[复制链接]

尚未签到

发表于 2015-4-22 07:03:16 | 显示全部楼层 |阅读模式
  豆瓣Python版有人想要goto。虽说看不出来goto有什么特别吸引力,但是为了实现Python社区对广大人民群众做出的“Python是世界上除Lisp外最牛b的编程语言”的庄严承诺,同时也为了复习一下一段时间没用Python知识,写了一个goto模块。使用如下例:



1 from goto import *
2
3 @patch
4 def f2():
5     goto(10)
6     print 'should not see this'
7     label(10)
8     for i in range(1,99999):
9         print i
10         if i == 5:
11             goto('out')
12     label('out')
13
14 f2()  用法是:

  1. from goto import *。注意暂时不支持import goto,不是不能实现,是暂时没时间写。
  2.对需要使用goto的函数,前面加个@patch
  3.用label(x)和goto(x)的形式写label和goto。x可以是数字或字符串。

  goto模块的代码如下:


DSC0000.gif DSC0001.gif goto.py

import dis,pdb
#dummy functions serving as target of bytecode patching
def goto(label):
    pass
def label(label):
    pass
#
def decode_bytecode(fun):
    """Input: a function
       Ouput: a list of pairs (opcode, arguments)"""
    c = fun.func_code.co_code
    n = len(c)
    i = 0
    while i < n:
        op = c
        i += 1
        arguments = ""
        if ord(op) >= dis.HAVE_ARGUMENT:
            arguments = c[i : i+2]
            i += 2
        yield (op, arguments)
def sample():
    goto(200)
    if 1 == 2:
        sample()
    else:
        print 'sample'
        
def test_decode(fun):
    for op,arg in decode_bytecode(fun):
        if arg=='':
            print dis.opname[ord(op)]
        else:
            print dis.opname[ord(op)] +' '+str(ord(arg[0]))+' '+str(ord(arg[1]))
        
def match_pattern(seq, i, p):
    """
    try to match pattern p to seq[i:], return None if match failed
    seq: output of decode_bytecode
    p -> [instr, instr, ...]
    instr -> (opcode, arg, arg)      opcode is a opcode string
    arg -> ''                        I don't give a damn about this arg
    arg -> integer                   match arg with number
    arg -> string                    the arg is key of the returned match dict from which the arg value can be extracted
    arg -> lambda                    lambda is evaluated with the argument, false return means failed match
    """
    #pdb.set_trace()
    m = {}
    for op, arg1, arg2 in p:
        if i==len(seq):
            return None
        
        if dis.opmap[op] != ord(seq[0]):
            return None
        if arg1 == '':
            pass
        else:
            if seq[1] == '': return None
            
            a1 = ord(seq[1][0])
            if type(arg1) is str:
                m[arg1]=a1
            elif type(arg1) is int:
                if arg1 != a1: return None
            elif not arg1(a1):
                return None
        #don't need arg2 in this program

        i+=1
        
    return m
        
def int_to_bytecode_arg(i):
    return chr(i  % 256) +\
           chr(i // 256)
def patch(fun):
    NOP = chr(dis.opmap['NOP'])
    co = fun.func_code
    old = list(decode_bytecode(fun))
    new = [] #a list of characters
   
    #mapping from label to bytecode offset
    label_table={}
    #if a goto(label) is seen but label is not seen
    #record for the number the bytecode offset of the
    #argument for JUMP_ABSOLUTE for later patching
    goto_table={}
    i=0
    #pdb.set_trace()
    while i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59338-1-1.html 上篇帖子: python调用外部子进程,通过管道实现异步标准输入和输出的交互 下篇帖子: Python+Django在windows下的开发环境配置图解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表