CodeSOD: The Key to Lookups
After some "miscommunications about coding standards", Nicolas's company decided that they should have one of their internal developers do code reviews on anything that came from their external, third-party developers. Nicolas drew the short straw on the most recent project.
The specific problem in play is that they had config-data, structured as nested dictionaries. You know the kind of data-structure- something like:
{ database: { connString: "someDb:abc:123", pageSize: 50 }, api: { url: "https://foo/data", defaultHeaders: { "X-Api-Key": "d0908ad1-3e28-419f-ab05-0c74eae1ca37" } }}
In their specific configuration, keys could be nested to any arbitrary depth. Someone wanted a helper method, that, given an array of keys: ["api", "defaultHeaders", "X-Api-Key"], could return the value associated with the key.
You might be thinking of some iterative or recursive approach for walking the tree, but a smart Python programmer knows that unrolling a loop boosts performance" right? Is that how it works? Well, no matter:
def getObjectValue( listObj): """ returns the value of the required object by construction the object from the list of string values """ x = len(listObj) if x == 1: return config_data_list[listObj[0]] if x == 2: return config_data_list[listObj[0]][listObj[1]] if x == 3: return config_data_list[listObj[0]][listObj[1]][listObj[2]] if x == 4: return config_data_list[listObj[0]][listObj[1]][listObj[2]][listObj[3]] if x == 5: return config_data_list[listObj[0]][listObj[1]][listObj[2]][listObj[3]][listObj[4]] if x == 6: return config_data_list[listObj[0]][listObj[1]][listObj[2]][listObj[3]][listObj[4]][listObj[5]] if x == 7: return config_data_list[listObj[0]][listObj[1]][listObj[2]][listObj[3]][listObj[4]][listObj[5]][listObj[6]]
Good thing their config file doesn't have 8 nested levels of configuration data. Then again, why does someone's config data have 7 nested levels?
[Advertisement] Manage IT infrastructure as code across all environments with Puppet. Puppet Enterprise now offers more control and insight, with role-based access control, activity logging and all-new Puppet Apps. Start your free trial today!