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

2019-07-04 14:26:54 +08:00
 beneo
有一种已经定义好格式的数据类型需要处理,但是多租户架构,每个客户的处理方式是不统一的。

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

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

谢谢各位
2342 次点击
所在节点    Python
19 条回复
www5070504
2019-07-04 15:00:40 +08:00
a = __import__("模块名")
a.xx
这种行不

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX