Skip to content

Catene di metodi con interruzioni di riga in Python

Python

Alcune librerie Python, come panda, NumPy e Pillow (PIL), sono in modo che i metodi possono essere concatenati ed elaborati in ordine (= concatena dei metodi).

Il concatenamento di metodi non è una sintassi speciale, poiché si limita a ripetere il processo di chiamata di un metodo direttamente dal valore restituito.

Il numero di caratteri per riga tende ad essere lungo si utilizza catene di metodi, ma è possibile utilizzare le interruzioni per quando le righe secondo necessità.

Innanzitutto, questo articolo le seguenti descrizioni di base utilizzando i panda come esempio.

  • Metodo concatenamento nei panda
  • Interruzioni di riga tra parentesi
  • Usa le barre rovesciate
  • Racchiudi tra parentesi per interrompere le linee

Successivamente, questo articolo presenta esempi di NumPy e Pillow (PIL).

  • Concatenamento di metodi in NumPy
  • Concatenamento di metodi in Cuscino(PIL)

PEP8, la guida allo stile Python (convenzioni di codifica), include la sezione una sull’indentazione ma non menzionata il concatenamento dei metodi.

Si conferma che i seguenti codici di esempio non generano alcun avviso dal controllo della codifica flake8.

Metodo concatenamento nei panda

Molti metodi di pandas.DataFrame e pandas.Series restituiscono pandas.DataFrame e pandas.Series ei metodi possono essere concatenati.

Se non utilizzare una catena di metodi, puoi scrivere, ad esempio, quanto segue:

Leggi il file con read_csv().

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)

print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

Aggiungi nuove colonne a questo pandas.DataFrame, elimina le colonne non necessarie, ordina ed estrai solo le prime tre righe.

df = df.assign(point_ratio=df['point'] / 100)
df = df.drop(columns='state')
df = df.sort_values('age')
df = df.head(3)

print(df)
#          age  point  point_ratio
# name                            
# Charlie   18     70         0.70
# Alice     24     64         0.64
# Ellen     24     88         0.88

Lo stesso processo può essere scritto collegando i metodi come segue.

df_mc = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0).assign(point_ratio=df['point'] / 100).drop(columns='state').sort_values('age').head(3)

print(df_mc)
#          age  point  point_ratio
# name                            
# Charlie   18     70         0.70
# Alice     24     64         0.64
# Ellen     24     88         0.88

Se il concatenamento dei metodi sia comodo e semplice da scrivere, può portare a risultati imprevisti se colleghi molti metodi che non capisci bene. Se non li conosci, potrebbe essere più sicuro applicare i metodi uno per uno e controllare i risultati.

Ci sono anche alcuni svantaggi, come la mancanza di completamento per il secondo ei successivi metodi in alcuni editor.

Interruzioni di riga tra parentesi

In Python, puoi interrompere liberamente le righe tra parentesi, quindi scrivere come segue:

df_mc_break = pd.read_csv(
    'data/src/sample_pandas_normal.csv',
    index_col=0
).assign(
    point_ratio=df['point'] / 100
).drop(
    columns='state'
).sort_values(
    'age'
).head(
    3
)

Nota che anche se puoi usare liberamente le interruzioni di riga, viene generato un errore se interrompi una riga in una stringa letterale.

# df_mc_break = pd.read_csv(
#     'data/src/sample_
#     pandas_normal.csv',
#     index_col=0
# ).assign(
#     point_ratio=df['point'] / 100
# ).drop(
#     columns="state"
# ).sort_values(
#     'age'
# ).head(
#     3
# )
# SyntaxError: EOL while scanning string literal

Naturalmente, puoi interrompere le linee solo dove ci sono molti.

dfdf_mc_break_mc = pd.read_csv(
    'data/src/sample_pandas_normal.csv', index_col=0
).assign(
    point_ratio=df['point'] / 100
).drop(columns='state').sort_values('age').head(3)

Usa le barre rovesciate

In Python, la barra rovesciata () è un carattere di continuazione e, quando viene posizionato alla fine di una riga, ignora le interruzioni di riga successive e considera la riga continua.

Usando questo, puoi scrivere quanto segue.

df_mc_break_backslash = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0) 
                          .assign(point_ratio=df['point'] / 100) 
                          .drop(columns='state') 
                          .sort_values('age') 
                          .head(3)

Racchiudi tra parentesi per interrompere le linee

Puoi anche utilizzare la regola per cui puoi interrompere liberamente le righe tra parentesi e racchiudere l’intero codice tra parentesi ().

df_mc_break_parens = (
    pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
    .assign(point_ratio=df['point'] / 100)
    .drop(columns='state')
    .sort_values('age')
    .head(3)
)

Anche in questo caso sei libero di usare o meno le interruzioni di riga, quindi puoi scrivere quanto segue.

df_mc_break_parens = (pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
                      .assign(point_ratio=df['point'] / 100)
                      .drop(columns='state')
                      .sort_values('age')
                      .head(3))

Mettere un punto (. ) alla fine di una riga non provoca un errore. Tuttavia, in questo caso, potrebbe essere difficile vedere che si tratta di una catena di metodi, quindi quindi evitarlo.

df_mc_break_parens = (
    pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0).
    assign(point_ratio=df['point'] / 100).
    drop(columns='state').
    sort_values('age').
    head(3)
)

Allo stesso modo, puoi scrivere una lunga stringa usando le parentesi per interrompere le righe nel codice. Vedi il seguente articolo.

Concatenamento di metodi in NumPy

Esistono diversi metodi per l’array NumPy ndarray che richiede ndarray.

Esempio senza concatenamento di metodi:

import numpy as np

a = np.arange(12)
a = a.reshape(3, 4)
a = a.clip(2, 9)

print(a)
# [[2 2 2 3]
#  [4 5 6 7]
#  [8 9 9 9]]

Esempio con concatenamento di metodi:

a_mc = np.arange(12).reshape(3, 4).clip(2, 9)

print(a_mc)
# [[2 2 2 3]
#  [4 5 6 7]
#  [8 9 9 9]]

Interrompere una riga racchiudendola tra parentesi.

a_mc_break_parens = (
    np.arange(12)
    .reshape(3, 4)
    .clip(2, 9)
)

print(a_mc_break_parens)
# [[2 2 2 3]
#  [4 5 6 7]
#  [8 9 9 9]]

Nota che in NumPy, molte operazioni sono definite come funzioni con ndarray come argomento, piuttosto che come metodi di ndarray, quindi non puoi fare tutto con una catena di metodi come puoi con i panda.

Concatenamento di metodi in Cuscino(PIL)

Nella libreria di elaborazione delle immagini Pillow(PIL), le immagini sono rappresentate dal tipo di immagine. Alcuni metodi di immagine restituiscono anche l’immagine elaborata.

Esempio senza concatenamento di metodi:

Viene caricato un file immagine, vengono eseguiti vari processi e, infine, viene salvato come un altro file.

from PIL import Image, ImageFilter

im = Image.open('data/src/lena_square.png')
im = im.convert('L')
im = im.rotate(90)
im = im.filter(ImageFilter.GaussianBlur())
im.save('data/temp/lena_square_pillow.jpg', quality=95)

Esempio con concatenamento di metodi:

Image.open('data/src/lena_square.png').convert('L').rotate(90).filter(ImageFilter.GaussianBlur()).save('data/temp/lena_square_pillow.jpg', quality=95)

Interrompere una riga racchiudendola tra parentesi.

Questo esempio può apparire un po’ strano perché se si esegue tutto, dal caricamento al salvataggio in una volta, è possibile completare il processo senza rilasciare il valore restituito a una variabile.

(
    Image.open('data/src/lena_square.png')
    .convert('L')
    .rotate(90)
    .filter(ImageFilter.GaussianBlur())
    .save('data/temp/lena_square_pillow.jpg', quality=95)
)