首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Python操作树转储为类似于Perl的B::简洁?

将Python操作树转储为类似于Perl的B::简洁?
EN

Stack Overflow用户
提问于 2018-04-18 03:33:50
回答 2查看 59关注 0票数 1

Perl有一个叫做B::Concise的东西,我们可以在-MO=Concise中使用它

代码语言:javascript
复制
perl -MO=Concise -e "!$a&&!$b"
7  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
6     <1> not vK/1 ->7
4        <|> or(other->5) sK/1 ->6
-           <1> ex-not sK/1 ->4
-              <1> ex-rv2sv sK/1 ->-
3                 <#> gvsv[*a] s ->4
-           <1> ex-not sK/1 ->6
-              <1> ex-rv2sv sK/1 ->-
5                 <#> gvsv[*b] s ->6

有没有办法让Python将optree转储为文本可读的内容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-18 04:11:22

我可以使用dis模块做到这一点

代码语言:javascript
复制
import dis;

a = 5;

def f():
    a = a+1
    print "foo"

print dis.dis(f);

输出,

代码语言:javascript
复制
  7           0 LOAD_FAST                0 (a)
              3 LOAD_CONST               1 (1)
              6 BINARY_ADD          
              7 STORE_FAST               0 (a)

  8          10 LOAD_CONST               2 ('foo')
             13 PRINT_ITEM          
             14 PRINT_NEWLINE       
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        
None
票数 1
EN

Stack Overflow用户

发布于 2018-04-18 04:14:15

您可以从ast获取dis,而不是从AST获取字节码

代码语言:javascript
复制
>>> import ast
>>> ast.dump(ast.parse("a = a+1").body[0])
"Assign(targets=[Name(id='a', ctx=Store())], value=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Num(n=1)))"

问题中的示例:

代码语言:javascript
复制
>>> ast.dump(ast.parse("not a and not b").body[0])
"Expr(value=BoolOp(op=And(), values=[UnaryOp(op=Not(), operand=Name(id='a', ctx=Load())), UnaryOp(op=Not(), operand=Name(id='b', ctx=Load()))]))"

下面是一个定义示例:

代码语言:javascript
复制
>>> ast.dump(ast.parse("""def f():
...     a = a+1
...     print \"foo\"""").body[0])
"FunctionDef(name='f', args=arguments(args=[], vararg=None, kwarg=None, defaults=[]), body=[Assign(targets=[Name(id='a', ctx=Store())], value=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Num(n=1))), Print(dest=None, values=[Str(s='foo')], nl=True)], decorator_list=[])"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49886145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档