Daily Shaarli

All links of one day in a single page.

May 19, 2014

inspect.getsource: Voir le code source d'une fonction Python (implémentée en Python, pas en C)

Oooouh, je connaissais pas inspect.getsource, c'est génial. ^-^

Python Patterns - An Optimization Anecdote | Python.org

Petit guide d'optimisation en Python.

Nice reading.

30 Python Language Features and Tricks You May Not Know About

Ouuuuuh, y a des trucs vachement chouettes !

Comme "1.14 Grouping adjacent list items using zip", c'est brillant, utilisé plusieurs instances du même objet iter pour regrouper les éléments ensemble. <3 (Même si j'avoue que la deuxième méthode est ptet plus lisible :D )

Ou "1.30 Using default dictionaries to represent simple trees" : Miam !

Etc.

(via http://sebsauvage.net/links/?3ASd0g )

[Python 3 FIX] 30 Python Language Features and Tricks You May Not Know About: Mapping objects to unique counting numbers (collections.defaultdict)

AttributeError: 'itertools.count' object has no attribute 'next'

Arf …

Le code suivant ne fonctionne donc plus en Python 3 :

import itertools, collections
value_to_numeric_map = collections.defaultdict(itertools.count().next)
value_to_numeric_map['a']
0
value_to_numeric_map['b']
1
value_to_numeric_map['c']
2
value_to_numeric_map['a']
0
value_to_numeric_map['b']
1

La première solution venant à l'esprit serait d'avoir à instancier une variable :

c = itertools.count()
value_to_numeric_map = collections.defaultdict(lambda a: next(c))

Et ça fonctionne très bien.

Mais personnellement, je préfère lorsque ça reste one-line, donc voici une alternative one-line :

J'utilise lambda pour créer une encapsulation (closure).

value_to_numeric_map = collections.defaultdict((lambda c: (lambda: next(c)))(itertools.count()))