On Wed, Apr 29, 2015 at 3:46 PM, Marc Tompkins <marc.tompk...@gmail.com> wrote: > On Wed, Apr 29, 2015 at 1:10 PM, boB Stepp <robertvst...@gmail.com> wrote: >> >> Python 2.4.4, Solaris 10. >> >> I have some functions that I believe I could collapse into a single >> function if I only knew how: >> >> def choose_compare(operator, value0, value1, pass_color, fail_color): >> """ >> Perform the comparison indicated by operator. Return pass_color if >> true, fail_color if false. >> """ >> if operator == '<': >> return less_than(value0, value1, pass_color, fail_color) >> elif operator == '<=': >> return less_than_or_equal(value0, value1, pass_color, fail_color) >> elif operator == '=': >> return equal(value0, value1, pass_color, fail_color) >> elif operator == '>': >> return greater_than(value0, value1, pass_color, fail_color) >> elif operator == '>=': >> return greater_than_or_equal(value0, value1, pass_color, >> fail_color) >> else: >> print 'WarningMessage = "Invalid comparison operator in >> function, choose_compare().@Please contact script administrator for >> assistance.";' >> >> def less_than(value0, value1, pass_color, fail_color): >> """ >> See if value0 is less than value1. If true, return pass_color. If >> false, return fail_color. >> """ >> if value0 < value1: >> return pass_color, True >> else: >> return fail_color, False >> >> def less_than_or_equal(value0, value1, pass_color, fail_color): >> """ >> See if value0 is less than or equal to value1. If true, return >> pass_color. If false, return fail_color. >> """ >> if value0 <= value1: >> return pass_color, True >> else: >> return fail_color, False >> >> ... 3 more functions ... >> >> I won't give the remaining functions for the other comparison >> operators. The string variable, operator, is originally populated from >> a data file, which tells what type of comparison needs to be made. The >> last two functions I gave (and the ones I omitted giving) all follow >> the same exact pattern. I know there has to be some way to replace >> these 5 functions with 1, but what experimentation I have done to date >> has not worked. >> >> Also, what about the first function above? I could use 2 dictionaries, >> 1 for calling the 5 functions and one to pass the arguments, but is it >> worth doing this? Or, I would not be surprised if there is a much >> better way! ~(:>)) >> >> Thanks! > > > Here's what I came up with: > > def choose_compare(operator, value0, value1, pass_color, fail_color): > comps = {"=":"==", "<":"<", ">":">", "<=":"<=", ">=":">="} > if operator in comps.keys(): > operator = comps[operator] > if eval("{} {} {}".format(value0, operator, value1)): > return pass_color, True > else: > return fail_color, False > else: > print('WarningMessage') > > I would ordinarily avoid eval() like the plague, but I think that this > sanitizes the input pretty effectively. I had to make comps a dict instead > of a list because (in your example, anyway) you're using a single equals > sign to check for equality, which throws a Syntax Error (e.g. "if 1 = 2" > instead of "if 1 == 2").
I could deal with the "=" issue by either reformatting my data file to use "==" in place of "=", or when I parse the data file, do the replacement there. A list instead of the dictionary looks a little easier on my eyes. The list has me so leery of eval and exec that I totally forgot about this possibility! There are only two places in my program where I read information directly into my program: 1) The data file, or 2) how the user of the planning software names his regions of interest (ROI) in the planning system software. I will reexamine my checks of (1). For (2) the planning software already has its own checks, which would filter out a lot. And I am checking the ROIs to see if they are present in the data file *exactly* as given in the data file; otherwise, I reject them. So I have stumbled (With your gracious help!) into a legitimate use of eval()? Many thanks, again! -- boB _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor