Chris Macaluso
Chris Macaluso

Reputation: 1482

Why am I getting Flake8 F821 error when the variable exists?

I have a function that's returning a variable, and a second function that's using it. In my main func though flake8 is coming up that the variable is undefined.

I tried adding it as a global var, and placing a tox.ini file in the same folder as my script with ignore = F821 but this didn't register either. A

Any suggestions? Code block is below for reference. new_folder is the culprit

def createDestination(self):
    '''
    split the src variable for machine type
    and create a folder with 'Evo' - machine
    '''
    s = src.split('\\')
    new_folder = (dst + '\\Evo ' + s[-1])
    if not os.path.exists(new_folder):
        os.makedirs(new_folder)
        return self.new_folder


def copyPrograms(new_folder):
    '''
    find all TB-Deco programs in second tier directory.
    '''
    # create file of folders in directory
    folder_list = os.listdir(src)
    # iterate the folder list
    for folder in folder_list:
        # create a new directory inside each folder
        folder_src = (src + '\\' + folder)
        # create a list of the files in the folder
        file_list = os.listdir(folder_src)
        # iterate the list of files
        for file in file_list:
            # if the file ends in .part .PART .dbp or .DBP - add it to a list
            if (file.endswith('.part') or file.endswith('.PART') or
                    file.endswith('.dbp') or file.endswith('.DBP')):
                # create a location variable for that file
                file_src = (src + folder + '\\' + file)
                # copy the file from the server to dst folder
                new_file = ('Evo ' + file)
                file_dst = (new_folder + '\\' + new_file)
                if not os.path.exists(file_dst):
                    shutil.copy2(file_src, file_dst)


def main():
    createDestination()
    copyPrograms(new_folder)


if __name__ == "__main__":
    main()

Upvotes: 0

Views: 1418

Answers (1)

chepner
chepner

Reputation: 531165

The first problem is that createDestination never defines an attribute self.new_folder, only a local variable new_folder. The indentation is also off, as you want to return new_folder whether or not you had to create it first.

def createDestination(self):
    '''
    split the src variable for machine type
    and create a folder with 'Evo' - machine
    '''
    s = src.split('\\')
    new_folder = (dst + '\\Evo ' + s[-1])
    if not os.path.exists(new_folder):
        os.makedirs(new_folder)
    return new_folder  # not self.new_folder

Second, you never assigned the return value of createDestination to any name so that you could pass it to copyPrograms as an argument.

def main():
    new_folder = createDestination()
    copyPrograms(new_folder)

Names have scope, and a variable named new_folder inside createDestination is distinct from one by the same name in main. As a corollary, there's no need to use the same name; the following definition of main works just as well:

def main():
    d = createDestination()
    copyPrograms(d)

and you don't even need to name the return value; you can pass it directly as

def main():
    copyPrograms(createDestination())

Upvotes: 1

Related Questions