推荐学习书目
› 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 · 3182 views
    This topic created in 2679 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
    www5070504
    Jul 4, 2019
    1
    a = __import__("模块名")
    a.xx
    这种行不

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