![]() |
1
248
首先,实际上有一种更简单的方法。我们想做的就是改变
或者,类似地,您可以使用monkeypatch
还有,没有什么问题
但是如果您确实想修改函数对象的代码常量,我们可以这样做。
如果您真的想真正使用代码对象,那么应该使用如下库
此外,不用说,并非所有Python实现都使用CPython风格的代码对象。这段代码将在CPython 3.7中运行,可能所有版本都会返回到至少2.2,并进行一些小的更改(不是代码黑客,而是生成器表达式),但它不会在任何版本的IronPython中运行。
对代码对象进行黑客攻击会出现什么问题?大部分只是断层,
使用
现在转到#2。 我提到代码对象是不可变的。当然常量是一个元组,所以我们不能直接改变它。常量元组中的东西是一个字符串,我们也不能直接更改它。这就是为什么我必须构建一个新的字符串来构建一个新的元组来构建一个新的代码对象。 但如果可以直接更改字符串呢?
好吧,在足够深的范围内,一切都只是指向一些C数据的指针,对吗?如果你用的是CPython
a C API to access the objects
和
you can use
不幸的是,字符串的C API不能让我们安全地访问已冻结字符串的内部存储。所以安全地拧,让我们 read the header files 我们自己去找那个储藏室。 如果您使用的是CPython 3.4-3.7(旧版本不同,谁知道将来会怎样),那么来自纯ASCII模块的字符串文字将使用压缩ASCII格式存储,这意味着结构会提前结束,ASCII字节的缓冲区会立即在内存中跟随。如果在字符串中放入非ASCII字符或某些类型的非文字字符串,这将中断(可能是segfault),但您可以通过其他4种方式读取不同类型字符串的缓冲区。
为了让事情变得更简单,我使用
如果你想玩这个东西,
假设代码框有一个无限长的滚动条。
我在IPython也做过同样的尝试,第一次我尝试评估
|
![]() |
2
38
猴子补丁
|
![]() |
3
5
从
我会用
用法:
将打印
|
![]() |
4
5
让我们将此与框架内省结合起来!
您会发现,这个技巧用调用函数或方法作为每个问候语的开头。这对于日志记录或调试可能非常有用;尤其是它允许您“劫持”第三方代码中的打印语句。 |
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Henry · 使用Python将json重新格式化为键值对 2 年前 |
![]() |
eymentakak · json字典类型错误:字符串索引必须是整数 2 年前 |
![]() |
Qubix · 从熊猫数据帧创建相对熵矩阵 2 年前 |
![]() |
guiguilecodeur · 如何删除我的词汇表中的重复元素 2 年前 |
![]() |
Susheel P M · 这是关于if-else语句[关闭] 2 年前 |
![]() |
Slartibartfast · 关于Python版本安装 2 年前 |