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