python:在循环中赋值之前避免使用变量的bug

时间:2010-11-05 02:02:42

标签: python namespaces coding-style

for element in container:
  # some code here
  temp_variable = f1(element)
  # more code

# much later in the code

for element in container:
  # some code
  another_variable = g(temp_variable)
  # more code
  temp_variable = f2(element)
  # more code

在第二个for循环中,我在分配之前意外使用了变量temp_variable。通常情况下,我会得到NameError异常,但不幸的是,它在前一个循环中幸存,有效并初始化。

是否有任何编码实践,IDE工具等可以帮助防止此类错误?

顺便说一下,我觉得如果循环中的变量没有在循环结束后存活可能会更好。

修改

@Ignacio Vazquez-Abrams:

如果我理解正确,建议不要在多个循环中使用相同的变量名作为局部变量。我有两个问题:

  1. 在多个循环中,使用的最具描述性的变量名称通常是相同的。说,我使用了unique_visitor_count之类的东西。我不想禁止这个变量在代码中进一步使用,在另一个循环中。

  2. 在处理现有代码时,检查我之前是否已经使用过任何新的变量名称是非常繁重的。

6 个答案:

答案 0 :(得分:7)

如果在代码中“更晚”,那么您应该将代码分解为多个函数。听起来这个功能太长了。

另一个提示是使用有意义的名称。 temp_variabletmptemp等不是好名字。使用描述其指向的值的名称。这将消除此类问题的大量潜在事件。

此外,列表推导不会泄漏他们的变量,所以如果你可以使用它们,那么这只是他们通常更好的另一个原因。但它们并不适用于所有情况。

答案 1 :(得分:4)

如果希望变量在循环结束后消失,请将循环重构为函数。这样,在调用函数之后,变量将超出范围并将被垃圾收集。

至于可以防止此类错误的编码实践,我建议您。)将这些类型的函数放在函数中需要临时变量,并且b。)单元测试(因为第二个for循环不会执行本身,只是for循环的单元测试会抓住你的错误。)

答案 2 :(得分:3)

尝试在不再需要时添加del temp_variable

答案 3 :(得分:3)

如果您不希望它泄漏局部变量,其他人建议将代码放入函数中。我想建议您将这些函数放在函数中。通过这种方式,他们可以访问外部函数中定义的变量,因此您不必将它们传入。只需在需要时定义内部函数并立即调用它们,除非它们可以重复使用。

def myfunc(a):

    i = 10

    def infunc():
        for i in range(a):
            print i,
    infunc()

    print i

myfunc(5)
>>> 0 1 2 3 4 10

这不是特别漂亮,但确实有效,你不应该经常使用它。

答案 4 :(得分:0)

尝试运行pylint。它不会直接捕获这样的错误,但会告诉您何时不使用变量的值。

答案 5 :(得分:0)

  

是否有任何编码实践,IDE工具等可以帮助防止此类错误?

首先设计。代码第二。