1
www5070504 2019-07-04 15:00:40 +08:00
a = __import__("模块名")
a.xx 这种行不 或者用 eval eval 不太安全 |
2
beneo OP @www5070504 都是我们内部使用,我觉得 eval 还好,我在找有没有更好的
|
3
Maboroshii 2019-07-04 15:01:53 +08:00 via Android
先写到文件,再执行文件
|
4
pmispig 2019-07-04 15:46:07 +08:00
先写到文件,再动态 import ?
|
5
no1xsyzy 2019-07-04 15:50:50 +08:00
AST 现场修改代码
PyMacro 似乎就是这么干的 |
6
oatw 2019-07-04 17:17:16 +08:00
元编程? Ruby 是可以实现的,Python 不清楚。
不过 Python 不也是动态语言吗?有编译时?!还是只有运行时? |
7
zealic 2019-07-04 17:19:29 +08:00
Py in Py
|
8
xiaket 2019-07-04 17:24:24 +08:00
动态代码加载如果还觉得不够的话, 可能只能和楼上说的一样, 用元编程定义一个 DSL 了. 如果不想搞那么复杂, 搞一个中间文件格式出来, 所有客户的输入都统一转成这个格式, 然后再统一处理也行
|
9
myyou 2019-07-04 18:10:29 +08:00
exec
|
10
misaka19000 2019-07-04 18:23:58 +08:00
每当这种场景我就推荐用 golang 写基础逻辑,然后用 lua 写脚本来处理新的逻辑 hhh
|
11
BBCCBB 2019-07-04 18:36:08 +08:00
动态 import, 你客户的处理代码加唯一标识,import 的时候按照你这个唯一标识的规则 import 进去执行。
|
12
BBCCBB 2019-07-04 18:37:02 +08:00
lua 这种可以为每个函数单独设置 environment 的安全些。
|
13
anonymous256 2019-07-04 19:30:13 +08:00 via Android
采用框架-组件(插件)的架构,你的核心代码是框架,每个客户的代码是组件。不必重新发布,只更新组件就可以了。
|
14
spotfg 2019-07-05 00:26:02 +08:00
猴子补丁
|
15
Takamine 2019-07-05 10:05:32 +08:00
干脆自己写一个编译器 2333333333333333333333333333333333333333。
|
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 |
19
goofool 2019-07-05 19:39:02 +08:00
抽象方法?
|