我试图使用一个名为interface.py的模块来定义一个条件列表和一些函数来检查这些条件的参数。然而,有成千上万的条件,所以我想使用字典而不是列表来防止需要查看所有这些条件。为此,我使用以下代码:
def listToDictionary(list):
"""This function takes a list of conditions and converts it to a dictionary
that uses the name of the condition as a key."""
d = {}
for condition in list:
if condition.name.lower() not in d:
d[condition.name.lower()] = []
d[condition.name.lower()].append(condition)
return d
conditionList = listToDictionary(conditions.list) #the condition list comes from another module
进一步进入文件的是实际的接口函数,它们将参数与条件列表进行比较 - 这些函数是在假设conditionList是字典的情况下编写的。
不幸的是,这不起作用。提供错误详细信息很困难,因为这个代码是由django页面导入的,我试图避免谈论django所以这个问题保持简单。基本上包含此代码的页面将不会加载,如果我将其更改为仅使用列表,一切正常。
我怀疑这个问题与Python如何处理import语句有关。我需要在导入interface.py后立即运行listToDictionary转换,否则接口函数将需要字典并获取列表。有没有办法确保这种情况发生?
答案 0 :(得分:1)
有根据的猜测:导入模块时,conditions.list
中的列表尚未完全构建。因此,您会得到一个缺少某些条目甚至是空的字典,这会导致以后出现问题。尝试推迟dict的构造,如下:
conditionTable = None # shouldn't call it list if it's a dict
def get_cond_table():
global conditionTable
if conditionTable is None:
conditionTable = listToDictionary(conditions.list)
return conditionTable
请参阅conditionList
。
get_cond_table()
答案 1 :(得分:1)
好吧,我发现问题出现在另一个仍然希望字典成为列表的函数中。我无法立刻看到它的原因是Django留下了一个非常神秘的错误信息。我能够使用python manage.py shell
获得更好的并且手动导入模块。
感谢大家的帮助。