假设我已经导入了两个这样的模块:
from module0 import hello_func
from directory.module1 import hello_var
其中模块0:
def hello_func(): return "hello from module0"
和模块1:
hello_var = "hello from module1"
如何知道每个对象是从哪个文件导入的?你知道吗
我试着检查locals()
函数,但是没有任何东西提供对文件的引用。。。你知道吗
Tags:
您可以在每个模块中定义一个常量及其路径,类似的操作应该可以:
导入该模块时,可以访问其位置,如下所示:
实际上,你自己也回答了你的问题:
不使用通配符导入的原因之一正是为了明确名称从何处导入(另一个原因是避免使用一个导入的名称来隐藏以前导入的名称-这往往会以最意想不到的方式破坏代码,有时甚至很难发现)。你知道吗
请注意,在您编辑的问题中:
你已经对名字的来源有了更好的认识。不是确切的文件路径,但至少是包/模块的名称。你知道吗
这也是不应该使用通配符导入的主要原因之一。你知道吗
现在如果你想知道确切的文件路径,你有两种不同的情况。你知道吗
有些对象跟踪它们是在哪里创建的(主要是模块、类、函数等-参见
inspect.getfile()
支持的类型列表),然后,您已经知道答案了(使用inspect.getfile()
xD)。你知道吗但大多数类型不会(因为没有理由)。在这种情况下,您必须知道它们是从哪个模块导入的,并对模块本身调用
inspect.getfile()
。在这种情况下,如果使用通配符导入,则必须手动检查从中导入的所有模块,以找出哪个模块定义了此名称。好好享受。特别是如果其中一个模块也使用了通配符导入。。。你知道吗模块将其保存在
__file__
属性中。函数和类在其__module__
属性中保留对其模块名称的引用,从中可以使用它从sys.modules
dict(当前进程中已导入的所有模块的缓存)检索模块,dict将为您提供文件。你知道吗我从来没有必要在这些信息中搜索回溯、帧、代码对象等,所以恐怕你得自己检查;-)
使用inspect和os模块的另一个解决方案。你知道吗
相关问题 更多 >
编程相关推荐