如何导入自定义 py 模块但在本地命名空间中重新定义它?
How do you Import a custom py module but redefine it within the local namespace?
我创建了一个自定义 py 文件,returns 您的 globals() 值并允许您删除任何导入的模块。但是,由于它在该函数中 运行s globals(),当我将模块导入另一个 py 文件时,它只是 returns 定义它的函数命名空间的 globals() 目录文件。我希望这是有道理的。
示例:
# custom py file: "mod1.py"
def mods():
return( globals() )
# different py file, kernel reset
from mod1 import mods
mods()
所以发生的事情是 运行ning globals() - returns 本地命名空间中的所有名称,但该命名空间是定义函数的地方,又名:“mod1.py”。我怎样才能 运行 它在第二个 py 文件中?
基于 this 对一个有点相关的问题的回答——如果我正确理解了你想要实现的目标——你可以:
mod1.py
import inspect
from types import ModuleType
def delete_modules():
"deletes modules from namespace of the caller"
frame = inspect.currentframe()
try:
globals = (frame.f_back.f_globals)
to_delete = []
for name, obj in globals.items():
if type(obj) == ModuleType and name != '__builtins__':
to_delete.append(name)
for name in to_delete:
print(f"Deleting module {name}")
del globals[name]
finally:
del frame
然后做:
>>> import os
>>> import sys
>>> from mod1 import delete_modules
>>> a = "hello"
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'delete_modules', 'os', 'sys']
>>> delete_modules()
Deleting module os
Deleting module sys
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'delete_modules']
我创建了一个自定义 py 文件,returns 您的 globals() 值并允许您删除任何导入的模块。但是,由于它在该函数中 运行s globals(),当我将模块导入另一个 py 文件时,它只是 returns 定义它的函数命名空间的 globals() 目录文件。我希望这是有道理的。
示例:
# custom py file: "mod1.py"
def mods():
return( globals() )
# different py file, kernel reset
from mod1 import mods
mods()
所以发生的事情是 运行ning globals() - returns 本地命名空间中的所有名称,但该命名空间是定义函数的地方,又名:“mod1.py”。我怎样才能 运行 它在第二个 py 文件中?
基于 this 对一个有点相关的问题的回答——如果我正确理解了你想要实现的目标——你可以:
mod1.py
import inspect
from types import ModuleType
def delete_modules():
"deletes modules from namespace of the caller"
frame = inspect.currentframe()
try:
globals = (frame.f_back.f_globals)
to_delete = []
for name, obj in globals.items():
if type(obj) == ModuleType and name != '__builtins__':
to_delete.append(name)
for name in to_delete:
print(f"Deleting module {name}")
del globals[name]
finally:
del frame
然后做:
>>> import os
>>> import sys
>>> from mod1 import delete_modules
>>> a = "hello"
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'delete_modules', 'os', 'sys']
>>> delete_modules()
Deleting module os
Deleting module sys
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'delete_modules']