在 python 中查找从何处导入某些内容



在 django 项目中,有时你有这样的代码

from settings import *

from local_settings import *

然后在代码的其余部分,您可以执行以下操作:

from django.conf import settings

我想做的是了解如何知道设置的哪一部分来自哪个文件。 我猜我必须以某种方式挂钩导入模块,并且可能会在导入之前和之后跟踪"设置"。

甚至不知道从哪里开始这样的事情。 我知道__file__,但这在这里不起作用,因为我正在寻找设置模块中的每个变量来自哪里。


更多信息

我写了一个我想开源的django应用程序,它将向你展示你的复合设置。 但在发布之前,我想添加查看个人设置来自何处的功能。 类似于Chrome开发工具中的"匹配CSS规则"。

我的一些项目导入多达 4 个文件,一个 base.py,一个 customer.py 一个 sub-customer.py,然后是一个 machine.py。 弄清楚设置来自哪里有时可能很有趣。

、函数和其他几个对象都有一个__module__属性。您可以从sys.modules获取模块对象:

>>> import os
>>> os.utime.__module__
'posix'
>>> import sys
>>> sys.modules[os.utime.__module__]
<module 'posix' (built-in)>

PS:我建议你听从马尔钦的建议,避免星星进口。

普通值没有导入来源。

解决方案不是使用 from <module> import * 指令;而是导入模块并直接引用其成员。

您的用例的另一个实用解决方案是使用一个 IDE,它可以显示每个文件中定义的内容,并使用它来帮助您分析给定设置的来源。

编程解决方案(假设每个设置文件不导入另一个设置文件)是导入一个文件,复制其__dict__,然后导入下一个文件。然后,您可以比较它们的更改,然后重复下一次导入。

即使您

使用*导入:

from base import *
from customer import *
from subcustomer import *
from machine import *

您仍然可以导入模块本身:

import base
import customer
import subcustomer
import machine

并了解每个模块已将哪些变量添加到全局命名空间:

base_names = set(dir(base))
customer_names = set(dir(customer))
subcustomer_names = set(dir(subcustomer))
machine_names = set(dir(machine))
common = base_names & customer_names & subcustomer_names & machine_names

我不确定您希望如何处理在多个模块中定义的变量名称。但是你可以通过使用集合减法找到那些明确由特定模块定义的名称。例如,要查找由base模块明确定义的名称,您可以计算:

base_names - customer_names - subcustomer_names - machine_names

尝试查看检查模块。http://docs.python.org/2/library/inspect.html ?您可以查看整个调用堆栈。

但实际上,你想解决什么?

最新更新