如何代理嵌套模块?

How to proxify a nested module?

假设我使用请求库导入了一个模块,但想对其使用代理。我在这里有两个选择:为这个库制作一个自定义补丁,这样我就可以使用代理或使用类似于 torify 的包装脚本来实现我想要的。

这些选项都不适合我,所以我想知道是否有办法使用 monkey-patching 或类似的样式来修改模块内的请求库(在 class 内)我没有。

编辑:

@zedfoxus 我正在使用位于 Mega.py 的库:​​richard.../mega.py

这是我迄今为止尝试过的猴子修补技术:

import inspect
from mega import mega
pr = 'https://103.9.124.210:8080'
p = {'https': pr, 'http': pr}
string = (
    inspect.getsource(mega).replace(
        'from .', 'from mega.'  # fix relative imports
    ).replace(
        'requests', '_req'
    ).replace(
        'import _req', f'import requests\n_req = requests.Session\n_req.proxies = {p}'
    ).replace(
        'def login(self, email=None, password=None):', 'def login(self, email=None, password=None):\n        print("milkGang")'
    ).replace('    ', '\t')  # follow my indentation style (tabs)
)
# milkgang shows up when I run the call, but the request proxy is not set :(
del mega
exec(string)

m = Mega()
...

我也试过:

import requests
requests = requests.Session()  # yes I know this is dangerous
### paste proxy code from earlier here ###
requests.proxies = p
import mega

import mega
import requests
requests = requests.Session()  # yes I know this is dangerous
### paste proxy code from earlier here ###
requests.proxies = p

以及重新定义 mega.Mega class

编辑 2:

修改我第一次尝试说 Session() 而不是 Session 似乎可行,但是,有没有更简洁的方法?

重新访问后,mega 模块似乎有一个名为 mega (mega.mega) 的自属性,我可以在其中看到导入的模块(并且由于 python 的性质, 也可以轻松更改它们)

import mega
from requests import Session
mega.mega.requests = Session()
# :)