EP 4 Fonctions d'aide à l'écriture au lieu d'expressions complexes

  • Python's syntax makes it all too easy to write single-line expressions taht are overly complicated and difficult to read

Effective Python

Let's thinke the situation where we want to parse the first value of the url parameters.

>>> from urllib.parse import parse_qs
>>> my_values = parse_qs("red=5&blue=0&green=", keep_blank_values=True)
>>> print(repr(my_values))
{'red': ['5'], 'blue': ['0'], 'green': ['']}
>>>

>>> print("Red", my_values.get('red'))
Red ['5']
>>> print("Green", my_values.get('green'))
Green ['']
>>> print("Opacity", my_values.get('opacity'))
Opacity ['']

We want to ensure that value should be integer and if it does not present in dictionaly, it returns 0.

red = int(my_values.get('red',[''])[0] or 0)

We can do this way. But it lacks readablity.

green = my_values.get('green', [''])
if green[0]:
    green = int(green[0])
else:
    green = 0

This flow is reused in other place and giving name for this process improves readablity. Therefore: a helper function is the way to go.

def get_frist_int(values, key, defalut=0):
    found = values.get(key, [''])
    if found[0]:
        found = int(found[0])
    else:
        found = default
    return found
green = get_first_int(my_values, 'green')

Recommended Posts

EP 4 Fonctions d'aide à l'écriture au lieu d'expressions complexes
EP 23 Accepter des fonctions pour des interfaces simples au lieu de classes
Élément de mémo Python efficace 4 Écrire une fonction d'aide au lieu d'une expression compliquée
EP 16 Envisager un générateur au lieu de renvoyer des listes
EP 7 Utiliser les compréhensions de liste au lieu de carte et de filtre