V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mythjava
V2EX  ›  问与答

请教一个关于 Python ast 的问题

  •  
  •   mythjava · 2023-05-30 14:10:28 +08:00 · 989 次点击
    这是一个创建于 546 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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-05-30 14:19:55 +08:00   ❤️ 1
    用正则表达式,几行就搞定了吧
    mythjava
        2
    mythjava  
    OP
       2023-05-30 14:22:11 +08:00
    @littlepanic72 我只是举了一个简单的例子 实际情况可能要复杂的更多 正则表达式我没有想到好的方式 方便举例说明一下嘛
    TtTtTtT
        3
    TtTtTtT  
       2023-05-30 14:27:00 +08:00   ❤️ 1
    =。=好家伙,静态语义分析,至少能搞一周+
    sujin190
        4
    sujin190  
       2023-05-30 14:42:46 +08:00   ❤️ 1
    @TtTtTtT #3 加上闭包动态属性什么的一周都不一定能搞定吧

    说不定还是直接运行一下然后通过 trace 追踪一下那些行被调用了实现起来更快呢,话说你干嘛呐?多余的代码就多余呗,耗点性能也无所谓吧
    vicalloy
        5
    vicalloy  
       2023-05-30 14:49:40 +08:00   ❤️ 1
    最可行的方案应当是直接用 python 的 ast 库
    https://docs.python.org/3/library/ast.html
    littlepanic72
        6
    littlepanic72  
       2023-05-30 15:03:43 +08:00   ❤️ 1
    @mythjava 如果你搞得太复杂的话我也不知道你的需求是啥样子的,可能搞不定你要的需求.... 如果只是要有出现 a 的行的话就挺简单的~~
    yxd19
        7
    yxd19  
       2023-05-30 15:35:07 +08:00
    如何定义与 a 相关呢?比如
    ```python
    a = "hello"
    b = a
    b += " world"
    ```
    中的第三行与 a 相关吗?如果是
    ```python
    a = [1,2,3]
    b = a
    b.append(4)
    ```
    呢?
    mythjava
        8
    mythjava  
    OP
       2023-05-30 16:02:55 +08:00
    @sujin190 用户写了很多 jupyter 文件 想要追踪其某个关键代码的上下文提取出来 我已经有点麻了
    mythjava
        9
    mythjava  
    OP
       2023-05-30 16:03:34 +08:00
    @yxd19 是的 这样也算是与 a 相关
    sujin190
        10
    sujin190  
       2023-05-30 16:14:41 +08:00 via Android   ❤️ 1
    @mythjava 提取出来用途是啥? python 好多都是运行起来才知道的,静态分析还是有限,如果想有限运行,那还不如搞沙箱来的容易一些
    mythjava
        11
    mythjava  
    OP
       2023-05-30 16:26:10 +08:00
    @sujin190 节省资源 有些取数的代码是走量收费的
    mythjava
        12
    mythjava  
    OP
       2023-05-30 16:26:41 +08:00
    @sujin190 您指的沙箱是什么意思 我可以搜索哪些关键字进行学习
    sujin190
        13
    sujin190  
       2023-05-30 16:33:54 +08:00 via Android   ❤️ 1
    @mythjava 那我猜你需要计费的代码应该是 numpy 和 pytorch 这样重数学计算库,或者大量文件和网络请求吧,参考 gevent monkey patch 的思路做拦截计费就行吧
    TtTtTtT
        14
    TtTtTtT  
       2023-05-31 09:42:34 +08:00
    @sujin190
    搞沙箱也挺复杂的,尤其是 branching 和 operator ,很容易跟丢。。
    sujin190
        15
    sujin190  
       2023-05-31 09:54:51 +08:00
    @TtTtTtT #14 通用沙箱 python 这种想对性能影响不大确实不容易,但看楼主需要似乎做的是类似 Google colab 的服务,应该是需要在调用特定算法库或者访问网络磁盘计费,这种就还好了吧,毕竟静态编译的 ast 分析分歧小但是加钩子还挺麻烦的,python 加钩子拦截可就容易的很了,安全调用和 cpu 内存限制其实放给容器或者其他通用沙箱环境就好了,没必要在 python 层面弄吧,毕竟系统层面弄这些可比 python 层面弄这些容易多了性能损失也最小
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:59 · PVG 08:59 · LAX 16:59 · JFK 19:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.