-1

在 django 项目中,有时你有类似的代码

from settings import *

或者

from local_settings import *

然后在你的代码的其余部分你做类似的事情

from django.conf import settings

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

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


更多信息

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

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

4

4 回答 4

3

普通值没有进口来源。

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

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

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

于 2013-09-20T18:55:56.887 回答
3

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

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

PS:我建议你听从 Marcin 的建议,避免明星进口。

于 2013-09-20T19:10:07.890 回答
1

即使您使用*导入:

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
于 2013-09-20T20:02:13.563 回答
0

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

但实际上,您要解决什么问题?

于 2013-09-20T18:56:01.907 回答