gpt4 book ai didi

python-3.x - 如何访问当前正在执行的模块?

转载 作者:行者123 更新时间:2023-12-05 07:21:48 24 4
gpt4 key购买 nike

我想从导入的模块访问调用环境。

import child

def test(xxx):
print("This is test " + str(xxx))

child.main()

现在 child :

import   inspect
def main():
caller = inspect.currentframe().f_back
caller.f_globals['test']("This is my test")

这行得通,但并不花哨。在类里面使用时是否有像“ self ”这样的简化?这个想法是做: caller.test('abc') 代替。

将调用者作为参数传递的一个选项,例如:child.main(self),但是 self 在此上下文中不可用。

Python 只加载一个模块的一个版本,因此,受到这个想法的诱惑:

import sys
myself=sys.modules[__name__]

然后将自己发送给 child :


child.main(myself)

创建对(新)模块的引用,而不是正在运行的模块,这就像创建一个新类:一个代码购买不同的环境。

最佳答案

如果您已经有了访问正确功能和数据的方法,为什么不将 f_globals 存储在包装类的实例上,然后从实例中调用事物,就好像它们是未绑定(bind)的一样特性?您可以使用类本身,但使用实例可确保在创建对象时从导入文件中获取的数据有效。然后您可以按照您想要的方式使用点运算符进行访问。这是您的文件:

import inspect

class ImportFile:
def __init__(self, members):
self.__dict__.update(members)

def main():
caller = inspect.currentframe().f_back
imported_file = ImportFile(caller.f_globals)
imported_file.test("This is my test")

输出:

This is test This is my test

不可否认,我没有你的设置,重要的是你试图从中提取的模块,所以很难确认这是否适合你,即使它对我有用,但我认为你也可以使用通过 globals() 或什至 inspect.getmembers() 调用 main 的方法,因为在您导入的模块中仍在您从 child 内部使用 f_back 访问的框架上。

导入的模块:

import child

def test(xxx):
print("This is test " + str(xxx))

child.main(globals())

child :

import inspect

class ImportFile:
def __init__(self, members):
self.__dict__.update(members)

def main(caller):
imported_file = ImportFile(caller)
imported_file.test("This is my test")

输出:

This is test This is my test

关于python-3.x - 如何访问当前正在执行的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com