V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
beneo
V2EX  ›  Python

请教没有把字符串的代码片段,插入到原来的 Python 代码中,并把这些代码一起编译运行的办法?

  •  
  •   beneo · 2019-07-04 14:26:54 +08:00 · 2308 次点击
    这是一个创建于 1729 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一种已经定义好格式的数据类型需要处理,但是多租户架构,每个客户的处理方式是不统一的。

    比方说,要处理的都是数字,变量只有两个 x, y,但是甲客户是要处理 x + y,乙客户需要处理的是 x / y,这样来一个客户我就要写一个处理方法,然后重新发布我真的烦透了。我不想用规则引擎,因为我需要客户的处理逻辑和原来的代码一起合并然后线下 debug,这个是必须的。

    所以有没有办法,能够把客户的代码插入到原来代码的办法,然后能打印出新的代码,还能把新的代码编译运行得到结果

    谢谢各位
    19 条回复    2019-07-05 19:39:02 +08:00
    www5070504
        1
    www5070504  
       2019-07-04 15:00:40 +08:00
    a = __import__("模块名")
    a.xx
    这种行不

    或者用 eval
    eval 不太安全
    beneo
        2
    beneo  
    OP
       2019-07-04 15:01:50 +08:00
    @www5070504 都是我们内部使用,我觉得 eval 还好,我在找有没有更好的
    Maboroshii
        3
    Maboroshii  
       2019-07-04 15:01:53 +08:00 via Android
    先写到文件,再执行文件
    pmispig
        4
    pmispig  
       2019-07-04 15:46:07 +08:00
    先写到文件,再动态 import ?
    no1xsyzy
        5
    no1xsyzy  
       2019-07-04 15:50:50 +08:00
    AST 现场修改代码
    PyMacro 似乎就是这么干的
    oatw
        6
    oatw  
       2019-07-04 17:17:16 +08:00
    元编程? Ruby 是可以实现的,Python 不清楚。
    不过 Python 不也是动态语言吗?有编译时?!还是只有运行时?
    zealic
        7
    zealic  
       2019-07-04 17:19:29 +08:00
    Py in Py
    xiaket
        8
    xiaket  
       2019-07-04 17:24:24 +08:00
    动态代码加载如果还觉得不够的话, 可能只能和楼上说的一样, 用元编程定义一个 DSL 了. 如果不想搞那么复杂, 搞一个中间文件格式出来, 所有客户的输入都统一转成这个格式, 然后再统一处理也行
    myyou
        9
    myyou  
       2019-07-04 18:10:29 +08:00
    exec
    misaka19000
        10
    misaka19000  
       2019-07-04 18:23:58 +08:00
    每当这种场景我就推荐用 golang 写基础逻辑,然后用 lua 写脚本来处理新的逻辑 hhh
    BBCCBB
        11
    BBCCBB  
       2019-07-04 18:36:08 +08:00
    动态 import, 你客户的处理代码加唯一标识,import 的时候按照你这个唯一标识的规则 import 进去执行。
    BBCCBB
        12
    BBCCBB  
       2019-07-04 18:37:02 +08:00
    lua 这种可以为每个函数单独设置 environment 的安全些。
    anonymous256
        13
    anonymous256  
       2019-07-04 19:30:13 +08:00 via Android
    采用框架-组件(插件)的架构,你的核心代码是框架,每个客户的代码是组件。不必重新发布,只更新组件就可以了。
    spotfg
        14
    spotfg  
       2019-07-05 00:26:02 +08:00
    猴子补丁
    Takamine
        15
    Takamine  
       2019-07-05 10:05:32 +08:00
    干脆自己写一个编译器 2333333333333333333333333333333333333333。
    beneo
        16
    beneo  
    OP
       2019-07-05 10:26:04 +08:00
    @spotfg 谢谢我去了解一下
    chenstack
        17
    chenstack  
       2019-07-05 11:40:29 +08:00   ❤️ 1
    刚好想知道 Python3.7 的 dataclass 是怎么实现初始化后统一调用__post_init__的,结果看源码发现是拼接 def __init__字符串,然后用 exec 动态生成方法的,和楼主的需求有点联系。
    https://github.com/python/cpython/blob/master/Lib/dataclasses.py#L370
    beneo
        18
    beneo  
    OP
       2019-07-05 12:31:06 +08:00
    @chenstack 感谢
    goofool
        19
    goofool  
       2019-07-05 19:39:02 +08:00
    抽象方法?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2941 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 15:09 · PVG 23:09 · LAX 08:09 · JFK 11:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.