Whats the right way to refactor this Big if/elif/elif ? - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Whats the right way to refactor this Big if/elif/elif ? (/thread-20117.html) |
Whats the right way to refactor this Big if/elif/elif ? - pitosalas - Jul-28-2019 This code is ugly and not pythonic. I am new to python not new to programming. Instead of guessing on one of many possible refectorings, could you tell me the pythonic way to do this? As you can see a bunch of variables (forward, left, right, etc) are set up with a floating point number. I want to store in a variable "closest_dir" a string name for the variable which contained the smallest value. forward = calc_range(msg.ranges, 359, 0, 15) right = calc_range(msg.ranges, 270, 271, 15) left = calc_range(msg.ranges, 90, 91, 15) back = calc_range(msg.ranges, 180, 181, 15) narrow_l1 = sum(msg.ranges[83:87])/5 narrow_l2 = sum(msg.ranges[88:92])/5 narrow_l3 = sum(msg.ranges[93:97])/5 narrow_r1 = sum(msg.ranges[273:277])/5 narrow_r2 = sum(msg.ranges[268:272])/5 narrow_r3 = sum(msg.ranges[263:267])/5 closest_dist = min(narrow_l1, narrow_l2, narrow_l3, narrow_r1, narrow_r2, narrow_r3, forward, left, right, back) if (closest_dist == forward): closest_dir = "forward" elif (closest_dist == left): closest_dir = "left" elif (closest_dist == right): closest_dir = "right" elif (closest_dist == back): closest_dir = "back" elif (closest_dist == narrow_l1): closest_dir = "narrow_l1" elif (closest_dist == narrow_l2): closest_dir = "narrow_l2" elif (closest_dist == narrow_l3): closest_dir = "narrow_l3" elif (closest_dist == narrow_r1): closest_dir = "narrow_r1" elif (closest_dist == narrow_r2): closest_dir = "narrow_r2" elif (closest_dist == narrow_r3): closest_dir = "narrow_r3" else: closest_dir = "bug" RE: Whats the right way to refactor this Big if/elif/elif ? - ichabod801 - Jul-28-2019 The first thing I think of is to make a list like so: dists = [(forward, 'forward'), (left, 'left'), ..., (narrow_r3, 'narrow_r3')] dists.sort() closest_dir = dists[0][1]But then there is the question of building the list. Could you convert your calculations into one function with parameters? directions = (('left', [359, 0, 15]), ('right', [270, 271, 15], ...) distances = [(dist_calc(*parameters), direction) for direction, parameters in direction] |