Is There a Better Way to Feed Different Parameters into Functions with If-Statements?

Posted by FlowofSoul on Stack Overflow See other posts from Stack Overflow or by FlowofSoul
Published on 2011-01-03T03:49:17Z Indexed on 2011/01/03 3:53 UTC
Read the original article Hit count: 237

Filed under:

I've been teaching myself Python for a little while now, and I've never programmed before. I just wrote a basic backup program that writes out the progress of each individual file while it is copying. I wrote a function that determines buffer size so that smaller files are copied with a smaller buffer, and bigger files are copied with a bigger buffer. The way I have the code set up now doesn't seem very efficient, as there is an if loop that then leads to another if loops, creating four options, and they all just call the same function with different parameters.

import os
import sys

def smartcopy(filestocopy, dest_path, show_progress = False):
    """Determines what buffer size to use with copy()
       Setting show_progress to True calls back display_progress()"""
    #filestocopy is a list of dictionaries for the files needed to be copied
    #dictionaries are used as the fullpath, st_mtime, and size are needed
    if len(filestocopy.keys()) == 0:
        return None
    #Determines average file size for which buffer to use
    average_size = 0
    for key in filestocopy.keys():
        average_size += int(filestocopy[key]['size'])
    average_size = average_size/len(filestocopy.keys())
    #Smaller buffer for smaller files
    if average_size < 1024*10000: #Buffer sizes determined by informal tests on my laptop
        if show_progress:
            for key in filestocopy.keys():
                #dest_path+key is the destination path, as the key is the relative path
                #and the dest_path is the top level folder
                copy(filestocopy[key]['fullpath'], dest_path+key, 
                     callback = lambda pos, total: display_progress(pos, total, key))
        else:
            for key in filestocopy.keys():
                copy(filestocopy[key]['fullpath'], dest_path+key, callback = None)
   #Bigger buffer for bigger files 
   else:
        if show_progress:
            for key in filestocopy.keys():
                copy(filestocopy[key]['fullpath'], dest_path+key, 1024*2600, 
                     callback =  lambda pos, total: display_progress(pos, total, key))
        else:
            for key in filestocopy.keys():
                copy(filestocopy[key]['fullpath'], dest_path+key, 1024*2600)

def display_progress(pos, total, filename):
    percent = round(float(pos)/float(total)*100,2)
    if percent <= 100: 
        sys.stdout.write(filename + ' - ' + str(percent)+'%   \r')
    else:
        percent = 100
        sys.stdout.write(filename + ' - Completed \n')

Is there a better way to accomplish what I'm doing? Sorry if the code is commented poorly or hard to follow. I didn't want to ask someone to read through all 120 lines of my poorly written code, so I just isolated the two functions. Thanks for any help.

© Stack Overflow or respective owner

Related posts about python