0

我正在尝试使用一个名为 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 转换,否则接口函数将需要一个字典并获得一个列表。有什么方法可以确保这种情况发生吗?

4

2 回答 2

1

有根据的猜测:conditions.list导入模块时,列表尚未完全构建。结果,您会得到一个缺少某些条目甚至是空的字典,这会导致以后出现问题。尝试推迟字典的构建,如下所示:

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().

于 2012-10-29T17:15:20.203 回答
1

好吧,我发现问题出在另一个函数中,它仍然希望字典是一个列表。我无法立即看到它的原因是 Django 留下了一个非常神秘的错误消息。我能够获得更好python manage.py shell的手动使用和导入模块。

谢谢大家的帮助。

于 2012-10-29T17:46:31.160 回答