2012-10-29 33 views
0

我正在尝试使用一个名为interface.py的模块,它定义了一个条件列表和一些函数来检查这些条件的参数。然而,有成千上万的条件,所以我想使用字典而不是列表来防止需要查看所有这些条件。要做到这一点,我用下面的代码:尽快在Python模块中执行代码

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如何对待导入语句有关。我需要listToDictionary转换在导入interface.py后立即运行,否则接口函数将会期待一个字典并获取一个列表。有什么方法可以确保这种情况发生?

+0

Python在导入时执行模块的主体,所以这不是你的问题。 –

+6

命名一个变量'list'绝不是一个好主意,你会隐藏内置类型。改为使用其他名称。 –

+1

@MartijnPieters我甚至会说:命名变量'list'总是一个可怕的想法 –

回答

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

+0

感谢您的建议 - 不幸的是我仍然遇到同样的问题。我开始认为这个问题可能出现在Django端,在这种情况下,试图简化问题可能会让我自己陷入困境。 – Keilan

1

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

感谢您的帮助。