Mat*_*ner 7 python namespaces module globals python-3.x
我想修改标准库中的一些类,以使用与该模块中其他类使用的不同的全局变量集.
此示例仅为示例:
# module_a.py
my_global = []
class A:
def __init__(self):
my_global.append(self)
class B:
def __init__(self):
my_global.append(self)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,如果我创建一个Avia 的实例A(),它将调用append名为的对象my_global.但是现在我希望创建一个新模块,导入B它,并从已导入的模块中B使用my_global,而不是原始定义my_global的模块B.
# module_b.py
from module_a import B
my_global = []
Run Code Online (Sandbox Code Playgroud)
我正在努力解释我的问题,这是我之前的尝试,其实确实提出了一些完全不同的东西:
标准库要求提供一个示例:
许多(也许所有?)的在类threading模块使用全局变量如_allocate_lock,get_ident和_active定义在这里和这里.如果不更改该模块中的所有类,则无法更改这些全局变量.
您不能在不影响模块的所有其他用户的情况下更改全局变量,但您可以做的是创建整个模块的私有副本.
我相信你很熟悉sys.modules,如果你从那里删除一个模块,Python会忘记导入它,但引用它的旧对象将继续这样做.再次导入时,将创建该模块的新副本.
对您的问题的hacky解决方案可能是这样的:
import sys
import threading
# Remove the original module, but keep it around
main_threading = sys.modules.pop('threading')
# Get a private copy of the module
import threading as private_threading
# Cover up evidence by restoring the original
sys.modules['threading'] = main_threading
# Modify the private copy
private_threading._allocate_lock = my_allocate_lock()
Run Code Online (Sandbox Code Playgroud)
而现在,private_threading.Lock全局变量完全独立于threading.Lock!
毋庸置疑,该模块并未考虑到这一点,特别是对于系统模块,threading您可能会遇到问题.例如,threading._active应该包含所有正在运行的线程,但是使用这个解决方案,_active它们都不会全部.该代码也可能会吃你的袜子,并将你的房子着火等.严格测试.
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |