这是如何运作的?

时间:2009-09-23 18:45:53

标签: python function matplotlib

所以我想在matplotlib.mlab中理解csv2rec的源文件。它用于获取csv文件并将数据解析为某些格式。所以它可能需要一个字符串'234'并将其转换为int。或者使用日期字符串并使其成为python日期时间。

def get_converters(reader):

    converters = None
    for i, row in enumerate(reader):
        if i==0:
            converters = [mybool]*len(row)
        if checkrows and i>checkrows:
            break
        #print i, len(names), len(row)
        #print 'converters', zip(converters, row)
        for j, (name, item) in enumerate(zip(names, row)):
            func = converterd.get(j)
            if func is None:
                func = converterd.get(name)
            if func is None:
                #if not item.strip(): continue
                func = converters[j]
                if len(item.strip()):
                    func = get_func(name, item, func)
            else:
                # how should we handle custom converters and defaults?
                func = with_default_value(func, None)
            converters[j] = func
    return converters

我对此功能的问题是“转换器”。它以“无”开头。然后'func = converters [j]'j我知道是一个只是通过枚举创建的数字。所以它正在寻找由j索引的相应转换器项。但转换器中没有任何东西,因为它是没有权利的吗?除非python程序不必从上到下阅读?在这种情况下,我们从接下来的两行“if len(item.st .... etc)”或'else:'部分获取func。但是,我只是假设它必须从上到下阅读。

我不知道其他任何事情是否重要,所以我只包括整个功能。 converterd是一个字典映射我相信用户可以提供一个参数来自动查找转换器。 checkrows只是一个由用户提供的数字,作为开始时检查有效性的参数。它默认为None。我仍然是一个初学者,所以只是fyi。 =)

谢谢大家。这个网站非常有帮助!

3 个答案:

答案 0 :(得分:2)

使用

在循环开始时再次设置转换器
if i==0:
  converters = [mybool]*len(row)

所以在那之后它不再是无。

答案 1 :(得分:1)

除非我遗漏了某些内容,否则在第一次迭代中“i”为0,因此执行以下操作:

converters = [mybool]*len(row)

并初始化“转换器”

答案 2 :(得分:1)

首先,

converters = None

设置converters的初始值。这样,如果迭代没有发生(因为readers可能为空),那么当函数返回converters时,它将存在并具有值None

如果迭代超过readers,那么converters会在迭代的第一次传递中立即重置为更有意义的值(i==0时):

converters = [mybool]*len(row)