1
toaruScar 2021-08-07 03:06:48 +08:00
|
2
toaruScar 2021-08-07 03:07:39 +08:00
*然后再导入 b py 那个文件
|
3
aijam 2021-08-07 03:12:13 +08:00 1
```
from unittest.mock import patch _print = print with patch('builtins.print') as mock: mock.side_effect = lambda x: _print("whatever you want") import a ``` |
4
LeeReamond OP @aijam 你好,我没有理解这段代码的逻辑
下面的代码我试了输出结果是 hello world ``` from unittest.mock import patch _print = print with patch('builtins.print') as mock: mock.side_effect = lambda x: _print("whatever you want") print("hello world") ``` |
5
aijam 2021-08-07 03:57:20 +08:00
@LeeReamond print 在 with block 里面
|
6
binux 2021-08-07 04:12:35 +08:00 via Android
覆盖一个 sys.stdout ?
|
7
LeeReamond OP @aijam 感谢,学习了,目前看来应该可以满足需求。看了看代码似乎是用魔术方法重载并替换内建方法。unitest 是内建库所以应该直接使用这个封装好的版本就可以了,不用自己再实现一遍。我也是第一次知道 python 可以跑 import builtins 这种东西
|
8
LeeReamond OP @aijam 后来又想了一下还是不太对啊,即使用魔术方法重新引入 buildins,它是怎么做到在 b 里的代码也不应该影响到 a 的 namespace 啊。。
|
9
noobsheldon 2021-08-07 09:35:57 +08:00
|
10
ClericPy 2021-08-07 11:40:25 +08:00
之前就像 6 楼说的重新覆盖一个新 class 代替默认的 sys.stdout 就行了, 当时是为了截获标准输出的时候复制一份到本地文件里以及主动 flush
|
11
ruanimal 2021-08-07 11:43:35 +08:00
from io import StringIO
import sys buf = StringIO() sys.stdout = buf print('nothing') sys.stdout = sys.__stdout__ print('something') |
12
NoAnyLove 2021-08-07 11:46:06 +08:00 1
|
13
jaredyam 2021-08-07 13:39:51 +08:00
你的目的归根结底就是把 stdout 转成 string 的 return,然后对 string 进行操作。
|
14
LeeReamond OP |
15
ruanimal 2021-08-07 22:08:13 +08:00
这设计到作用域
模块是全局对象,sys.stdout 是全局生效的,可以去了解下 mock 和猴子补丁 |
16
MiketsuSmasher 2021-08-08 08:39:07 +08:00
可以参考 stackoverflow 上的这个回答,整一个上下文管理器,把需要捕捉输出的代码扔进去
https://stackoverflow.com/a/6796752/16472044 |
17
wwqgtxx 2021-08-08 23:10:23 +08:00
@LeeReamond #14 “正常来说 a.py 和 b.py ,如果两者都 import 同一个模块的话,应该是互相独立互不影响的,在各自范围内按照各自的逻辑工作” 这句话本来就不成立,除非你在 a 中这样写:
import sys stdout = sys.stdout import b 这样的话,如果在 b 中修改 sys.stdout,并不会影响 a 中的 stdout,但依然会影响 sys.stdout |
18
generated 2021-08-13 10:57:00 +08:00 via Android
|