代码之家  ›  专栏  ›  技术社区  ›  Guy Katabi

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

  •  0
  • Guy Katabi  · 技术社区  · 6 年前

    我构建了以下模块,用于根据文件的大小和名称确定文件是否存在于目录中,这样我就可以在项目的不同部分使用它。当我第一次尝试使用该函数时,它非常有效。但当我再次调用它时,具有不同参数的不同变量返回第一个答案。我错过了什么?

    模块:

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   thmsdnnr    6 年前

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

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

    由于CORRECT\u PATH存储为全局路径,因此在 walktree 方法返回。

    我建议不要使用globals来修复代码。只是制造 check_matching 将结果直接返回给 walktree ,之后不缓存路径结果 walktree 返回。