在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。弄清楚设置的来源有时会很有趣。
答案 0 :(得分:3)
普通价值没有进口来源。
解决方案不是使用from <module> import *
指令;而是导入模块并直接引用其成员。
另一个实用的解决方案是使用一个ide,它可以显示每个文件中定义的内容,并使用它来帮助您分析给定设置的来源。
程序化解决方案(假设每个设置文件不导入另一个)是导入一个文件,复制其__dict__
,然后导入下一个文件。然后,您可以将它们进行比较以进行更改,然后重复下一次导入。
答案 1 :(得分:3)
类,函数和其他几个对象具有__module__
属性。您可以从sys.modules
获取模块对象:
>>> import os
>>> os.utime.__module__
'posix'
>>> import sys
>>> sys.modules[os.utime.__module__]
<module 'posix' (built-in)>
PS:我建议您遵循Marcin的建议,避免明星进口。
答案 2 :(得分: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
我不确定您希望如何处理已在多个模块中定义的变量名称。但是你可以通过使用set subtraction找到由特定模块明确定义的名称。例如,要查找由base
模块明确定义的名称,您可以计算:
base_names - customer_names - subcustomer_names - machine_names
答案 3 :(得分:0)
尝试查看检查模块。 http://docs.python.org/2/library/inspect.html? 你可以查看整个电话堆栈。
但实际上,你想要解决什么?