推荐学习书目
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 · Jul 4, 2019 · 2891 views
    This topic created in 2535 days ago, the information mentioned may be changed or developed.
    有一种已经定义好格式的数据类型需要处理,但是多租户架构,每个客户的处理方式是不统一的。

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

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

    谢谢各位
    19 replies    2019-07-05 19:39:02 +08:00
    www5070504
        1
    www5070504  
       Jul 4, 2019
    a = __import__("模块名")
    a.xx
    这种行不

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