Molto spesso durante la codifica in Python (o in qualsiasi altra lingua in cui il tipo non è specificato) mi imbatto nel seguente problema:
Voglio scrivere una funzione che possa accettare una cosa o un contenitore di tali cose in generale. Ad esempio, considera questa funzione sottoinsieme:
def subset(df, months=all_months):
return df[pd.DatetimeIndex(df['Timestamp']).month.isin(months)]
Vorrei ora poterlo chiamare sia con un elenco di mesi, sia con un mese. Il secondo caso tuttavia è possibile solo con qualcosa di brutto come:
subset(df, months=["June"]) # Why not just subset(df, "June")?
Posso pensare a 2 soluzioni, nessuna delle due mi sembra elegante:
-
Posso usare
isinstance
e trattare scalari diversi dai contenitori. Questo non è il massimo perché scrivo check e ci sono anche casi in cui il codice nella funzione è complesso e necessita di una revisione maggiore quando si tratta di uno scalare invece che di un elenco -
Potrei trasmettere l'argomento alla lista:
months = [months]
. Anche in questo caso utilizzereiisinstance
.
C'è una soluzione migliore di quella che ho pensato? Ancora meglio, c'è una soluzione ben nota di cui non sono a conoscenza?
Modifica
Entrambe le risposte hanno fornito soluzioni accettabili. Ho deciso di attenermi a quello proposto da @Doc Brown perché posso facilmente isolare il tipo di controllo in un decoratore e voglio evitare di introdurre lo scartare nell'API per motivi specifici del luogo di lavoro.