请教一个关于 Python ast 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mythjava

请教一个关于 Python ast 的问题

  •  
  •   mythjava 2023 年 5 月 30 日 1407 次点击
    这是一个创建于 1060 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想要截取出一段代码中的全部上下文 例如

    a = 3 b = 5 a = a + b c = 20 c = c / 2 func(a) func(b) a 

    我想要获取有关 a 的代码行

    a = 3 b = 5 a = a + b func(a) a 

    各位有知道什么快捷的工具吗, 如果没有只能手写的话 可以帮我预估一下大概要多久才可以写好呢

    15 条回复    2023-05-31 09:54:51 +08:00
    littlepanic72
        1
    littlepanic72  
       2023 年 5 月 30 日   1
    用正则表达式,几行就搞定了吧
    mythjava
        2
    mythjava  
    OP
       2023 年 5 月 30 日
    @littlepanic72 我只是举了一个简单的例子 实际情况可能要复杂的更多 正则表达式我没有想到好的方式 方便举例说明一下嘛
    TtTtTtT
        3
    TtTtTtT  
       2023 年 5 月 30 日   1
    =。=好家伙,静态语义分析,至少能搞一周+
    sujin190
        4
    sujin190  
       2023 年 5 月 30 日   1
    @TtTtTtT #3 加上闭包动态属性什么的一周都不一定能搞定吧

    说不定还是直接运行一下然后通过 trace 追踪一下那些行被调用了实现起来更快呢,话说你干嘛呐?多余的代码就多余呗,耗点性能也无所谓吧
    vicalloy
        5
    vicalloy  
       2023 年 5 月 30 日   1
    最可行的方案应当是直接用 python 的 ast 库
    https://docs.python.org/3/library/ast.html
    littlepanic72
        6
    littlepanic72  
       2023 年 5 月 30 日   1
    @mythjava 如果你搞得太复杂的话我也不知道你的需求是啥样子的,可能搞不定你要的需求.... 如果只是要有出现 a 的行的话就挺简单的~~
    yxd19
        7
    yxd19  
       2023 年 5 月 30 日
    如何定义与 a 相关呢?比如
    ```python
    a = "hello"
    b = a
    b += " world"
    ```
    中的第三行与 a 相关吗?如果是
    ```python
    a = [1,2,3]
    b = a
    b.append(4)
    ```
    呢?
    mythjava
        8
    mythjava  
    OP
       2023 年 5 月 30 日
    @sujin190 用户写了很多 jupyter 文件 想要追踪其某个关键代码的上下文提取出来 我已经有点麻了
    mythjava
        9
    mythjava  
    OP
       2023 年 5 月 30 日
    @yxd19 是的 这样也算是与 a 相关
    sujin190
        10
    sujin190  
       2023 年 5 月 30 日 via Android   1
    @mythjava 提取出来用途是啥? python 好多都是运行起来才知道的,静态分析还是有限,如果想有限运行,那还不如搞沙箱来的容易一些
    mythjava
        11
    mythjava  
    OP
       2023 年 5 月 30 日
    @sujin190 节省资源 有些取数的代码是走量收费的
    mythjava
        12
    mythjava  
    OP
       2023 年 5 月 30 日
    @sujin190 您指的沙箱是什么意思 我可以搜索哪些关键字进行学习
    sujin190
        13
    sujin190  
       2023 年 5 月 30 日 via Android   1
    @mythjava 那我猜你需要计费的代码应该是 numpy 和 pytorch 这样重数学计算库,或者大量文件和网络请求吧,参考 gevent monkey patch 的思路做拦截计费就行吧
    TtTtTtT
        14
    TtTtTtT  
       2023 年 5 月 31 日
    @sujin190
    搞沙箱也挺复杂的,尤其是 branching 和 operator ,很容易跟丢。。
    sujin190
        15
    sujin190  
       2023 年 5 月 31 日
    @TtTtTtT #14 通用沙箱 python 这种想对性能影响不大确实不容易,但看楼主需要似乎做的是类似 Google colab 的服务,应该是需要在调用特定算法库或者访问网络磁盘计费,这种就还好了吧,毕竟静态编译的 ast 分析分歧小但是加钩子还挺麻烦的,python 加钩子拦截可就容易的很了,安全调用和 cpu 内存限制其实放给容器或者其他通用沙箱环境就好了,没必要在 python 层面弄吧,毕竟系统层面弄这些可比 python 层面弄这些容易多了性能损失也最小
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1212 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 17:48 PVG 01:48 LAX 10:48 JFK 13:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86