使用我构建的模块中的函数返回第一个值,尽管使用不同的参数再次调用它



我构建了以下模块,用于根据文件的大小和名称识别目录中是否存在文件,以便我可以在项目的不同部分中使用它。当我第一次尝试使用该功能时,它效果很好。但是当我再次调用它时,具有不同参数的不同变量会返回第一个答案。我错过了什么?

模块:

import os
from stat import *
import math

CORRECT_PATH = ''
FLAG = 1

def check_matching(pathname, desired_file_name):
    global FLAG
    if desired_file_name in pathname:
        FLAG = 0
        return pathname

def walktree(dirz, desired_file_name, size):
    global CORRECT_PATH
    global FLAG
    for f in os.listdir(dirz):
        try:
            if FLAG:
                pathname = os.path.join(dirz, f)
                mode = os.stat(pathname)[ST_MODE]
                if S_ISDIR(mode):
                    # It's a directory, recourse into it
                    walktree(pathname, desired_file_name, size)
                elif S_ISREG(mode):
                    # It's a file, call the callback function
                    new_size = int(os.path.getsize(pathname))
                    if (new_size - int(size)) < math.fabs(0.95*int(size)):
                        CORRECT_PATH = check_matching(pathname, desired_file_name)
                else:
                    # Unknown file type, print a message
                    print 'Skipping %s' % pathname
            else:
                try:
                    CORRECT_PATH = CORRECT_PATH.replace('\', '/')
                    return True, CORRECT_PATH
                except WindowsError as w:
                    #print w
                    if w[0] == 5:
                        return True, CORRECT_PATH
        except WindowsError as e:
            pass
            # print e
            # if e[0] == 5:
            #    return True, CORRECT_PATH  # add correct path now
    return False, ''

现在,当我调用此代码时(这是一个示例,我正在使用两个不同的文本文件,它们的大小和名称不同,保存在我的本地计算机上(:

import LS_FINAL_FOUR
ans = LS_FINAL_FOUR.walktree("C:/", "a_test", 38)
print ans  # (True, 'C:/a_test.txt')
ans1 = LS_FINAL_FOUR.walktree("C:/", "a_sample", 1000000)
print ans1  # (True, 'C:/a_test.txt')

两者都返回相同的输出。非常令人沮丧。有谁知道这背后的原因以及如何解决它?编辑:我几乎可以肯定这是模块的问题,但我只是无法确定它。

每次

调用 walktree 时都需要将 FLAG 重置为 1。实际上,当您找到第一个文件时,FLAG 设置为零一次。每次后续调用,您都会重新访问此初始结果,因为如果 FLAG 为 false,则再次运行以下代码:

else:
  try:
    CORRECT_PATH = CORRECT_PATH.replace('\', '/')
    return True, CORRECT_PATH

由于CORRECT_PATH存储为全局,因此在walktree方法返回后,初始答案仍然存在。

我建议不使用全局变量来修复代码。只需让check_matching直接返回结果给walktree,并且不要在walktree返回后缓存路径结果。

相关内容

最新更新