1
est 2020-07-21 11:09:51 +08:00 via Android
把函数 inline 到其他函数里
|
2
SingeeKing 2020-07-21 11:12:27 +08:00 1
理论上动态语言做不到,不过如果实在有需求就用装饰器 + 反射验证调用来源吧
|
3
GTD OP @est #1 请问是什么意思?没理解诶。比如我现在有一个 A 模块隶属于一个包,然后在 a 模块里面做了 all 限制,但是外部函数通过 import 整个包,还是可以调用到 a 模块里面的其他函数
|
4
Acoolda 2020-07-21 11:40:28 +08:00 via Android 1
好像是没有办法解决,无论怎么样都可以有办法调用到,只能做规则约束(就像 python 私有函数一样,下划线起头告诉其他人这是私有的)
|
6
MoYi123 2020-07-21 12:07:45 +08:00
inspect 模块可以看的函数的调用栈,如果上一级调用栈不是本模块的函数,就报错。
|
7
BingoXuan 2020-07-21 12:22:58 +08:00 1
闭包——在函数内定义函数并返回该函数,具体参考装饰器
|
8
Leigg 2020-07-21 12:34:27 +08:00 via Android 1
__call__了解一下
|
9
kxiaong 2020-07-21 13:20:24 +08:00 1
如果是 module 一级的函数,理论上是不可能的。
类中封装的函数可以使用双下划线开头,使方法变成私有方法。module 一级的方法事实上跟包中定义的 class 是同一级别,而 python 对包一级的对象和函数,只有约定俗成的访问控制,而非强制。 我猜想一个可能比较 dirty 的方法: 使用一个字符串、时间戳与一个枚举的随机数做 md5,产生的结果作为一个私有函数的前缀,比如: `fun_prefix = hashlib.md5(encryptStr + str(time.time() )+ str(randInt) ).hexdigit()` 你的私有函数名字可以是: `fun_prefix+"my_private_function"`. 然后你在程序中调用时使用反射来调用函数。 因为外部不太可能知道你产生 fun_prefix 时的混淆算法,因此外部每次加载你的包时,看到的都是一个随机字符串+“my_private_function”的函数名,因此也没法调用你的函数。 如果你不得不用源代码的方式发布,可以把混淆加密部分做成二进制跟随你的包一起发布。 |
10
ruanimal 2020-07-21 15:14:06 +08:00
把这个函数嵌套到某个函数里面。
还可以用字符串定义函数,然后 exec 加载 |
11
leimao 2020-07-21 15:15:42 +08:00
Python 我记得你怎么做都能破解。所以不建议隐藏,没意义。
|
12
llsquaer 2020-07-22 10:35:28 +08:00
转为 pyd?
|
14
no1xsyzy 2020-07-22 10:51:25 +08:00
真要搞没办法的,甚至可以写个 C extension 甚至魔改的 Python 实现,以允许遍历全部对象、全部 frame,甚至直接动 AST,顺便干扰 inspect 模块的调用,避免你再回头检测调用者。
唯一的 solution 就是不写成 Python 代码。 |
15
sikong31 2020-07-22 15:28:10 +08:00
可以用 del 删除
|