Création d'une bibliothèque Python pour écrire des inclusions complexes et les réduire de manière facile à lire

J'ai écrit un article comme Astuces pour écrire une notation d'inclusion compliquée de manière facile à lire, mais j'ai créé une bibliothèque appelée xcomp basée dessus. .. Disponible sur Github.

Voici les objectifs de base.

Installation

pip install git+git://github.com/ukyo-su/xcomp@master

comp(collector)

for xcomp import comp

# a = [i for i in range(5)]Au lieu de
@comp(list)
def a():
    for i in range(5):
        yield i

# a == [0, 1, 2, 3, 4]

#Vous pouvez également prendre la somme. dict et set sont également possibles
@comp(sum)
def a():
    for i in range(5):
        yield i

# a == 10

#Facile à lire, même les inclusions compliquées
@comp(list)
def fizz_buzz():
    for i in range(30):
        if i % 15 == 0:
            yield "Fizz Buzz"
        elif i % 3 == 0:
            yield "Fizz"
        elif i % 5 == 0:
            yield "Buzz"
        else:
            yield i

multi_comp(*collectors) Si vous souhaitez créer plusieurs collections en une seule boucle.

from xcomp import multi_comp

data = [(0, 1), (2, 3)]

@multi_comp(list, list)
def a():
    for i, j in data:
        yield i, j

a_i, a_j = a

# a_i == [0, 2]
# a_j == [1, 3]

reduce_comp(init, for_=None, for_nest=(), result=lambda x: x)

Un décorateur pour écrire des functools.reduce un peu plus facile à lire. Raquette [pour / fold](https://docs.racket-lang.org/reference/for.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for%2Ffold% 29% 29) est l'histoire originale.

from xcomp import reduce_comp

# reduce(lambda sum_, i: sum_ + i, range(5), 0)
@reduce_comp(0, for_=range(5))
def a(sum_, i):
    return sum_ + i

# a == 10

#Nested for est également OK
@reduce_comp([], for_nest=(range(3), range(2)))
def a(acc, i, j):
    return [*acc, (i, j)]

# a == [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

#Lors de l'ajout d'un effort à la fin
@reduce_comp([], for_=range(5),
             result=lambda x: list(reversed(x)))
def a(acc, i):
    return [*acc, i]

# a == [4, 3, 2, 1, 0]

# break,soutient également continuer
@reduce_comp(0, for_=range(100))
def a(acc, i):
    if i > 5:
        raise BreakReduce
    return acc + 1

# a == 6

@reduce_comp(0, for_=range(10))
def a(acc, i):
    if i < 5:
        raise ContinueReduce
    return acc + i

# a == 35

(Est-ce vraiment facile à lire ...?)

multi_reduce_comp(*inits, for_=None, for_nest=(), result=lambda *args: args)

Reduce_comp quand il y a plusieurs variables d'accumulation. Ceci est proche du "for / fold" de Racket.

@multi_reduce_comp(0, [],
                   for_=range(5))
def a(sum_, rev_list, i):
    return sum_ + i, [i, *rev_list]

a_sum, a_rev_list = a

# a_sum == 10
# a_rev_list == [4, 3, 2, 1, 0]

@multi_reduce_comp([], set(),
                   for_=[0, 1, 1, 2, 3, 4, 4, 4],
                   result=lambda acc, seen: list(reversed(acc)))
def a(acc, seen, i):
    if i in seen:
        return acc, seen
    else:
        return [i, *acc], {*seen, i}

# a == [0, 1, 2, 3, 4]

delay_arg(func, *args, **kwargs)

Fonction d'ordre supérieur pour tourner le premier argument vers la fin. delay_arg (f, * args, ** kwargs) (a) devient f (a, * args, ** kwargs).

Vous pouvez utiliser map, filter, reduction comme décorateurs.

@list
@delay_arg(map, range(5))
def a(i):
    return i * 2

# a == [0, 2, 4, 6, 8]

Recommended Posts

Création d'une bibliothèque Python pour écrire des inclusions complexes et les réduire de manière facile à lire
Publier / télécharger une bibliothèque créée en Python vers PyPI
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
[Python] Combiner des listes contenant des nombres en chaînes et les écrire dans un fichier de sortie
Recherche d'un moyen efficace d'écrire un Dockerfile avec Python avec de la poésie
Je veux écrire en Python! (2) Écrivons un test
Écrire des tests en Python pour profiler et vérifier la couverture
[Python] Création d'une méthode pour convertir la base en 1 seconde
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
[Python] Comment écrire une instruction if en une phrase.
Développer une bibliothèque pour obtenir la liste des collections Kindle en Python
Un moyen standard de développer et de distribuer des packages en Python
J'ai créé une classe en Python et essayé de taper du canard
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
Essayez simplement de recevoir un webhook avec ngrok et Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Un jeu pour partir à l'aventure en mode interactif de python
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
Ecrire un serveur HTTP / 2 en Python
Ecrire des algorithmes A * (A-star) en Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Une alternative à `pause` en Python
Ecrire une liste de liens en langage C dans un style orienté objet (avec comparaison de code entre Python et Java)
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
Comment envoyer une image visualisée des données créées en Python à Typetalk
Comparer la grammaire de base de Python et Go d'une manière facile à comprendre
Jetons JavaScript et écrivons un front-end Web en Python!
Comment mettre un espace demi-largeur avant les lettres et les chiffres en Python.
J'ai essayé de résumer Cpaw Level1 & Level2 Write Up d'une manière facile à comprendre
Connectez-vous à postgreSQL depuis Python et utilisez des procédures stockées dans une boucle.
Je veux colorer une partie de la chaîne Excel avec Python
Comment écrire une chaîne de caractères lorsqu'il y a plusieurs lignes en python
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Ecrire le test dans la docstring python
Ecrire une courte définition de propriété en Python
Ecrire le fichier O_SYNC en C et Python
Comment obtenir stacktrace en python
Ecrire un programme de chiffrement Caesar en Python
Lire et écrire des fichiers JSON avec Python
Ecrire une méthode de cupidité simple en Python
Ecrire un plugin Vim simple en Python 3
Compressez les données python et écrivez sur sqlite
J'ai créé un outil de mot de passe en Python.
Comment utiliser is et == en Python
Comment écrire Ruby to_s en Python
[Python] A créé une classe pour jouer des vagues de péché en arrière-plan avec pyaudio
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Comment utiliser la bibliothèque C en Python
Organisez les modules et les packages Python dans le désordre