2014-12-13 8 views
6

Ad esempio, voglio utilizzare la funzione isnan di. Ho già caricato la libreria pandas:È spumoso utilizzare un pacchetto importato da un altro pacchetto o devo importarlo direttamente?

import pandas as pd 

pd.np.isnan(1) #=> False 

Questo funziona, ma c'è qualche svantaggio in questo? O dovrei scrivere

import pandas as pd 
import numpy as np 

np.isnan(1) #=> False 

Che cos'è una buona pratica?

+1

credo che questa realtà non ha una risposta basata sui fatti, coperto di [PEP 8] (https://www.python.org/dev/peps/pep-0008/#public-and-internal- interfacce) e dovrebbe essere riaperto. – abarnert

+2

In breve: 'np' non è documentato in' help (pd) 'o l'aiuto basato sul web di Pandas, e" Tutte le interfacce non documentate dovrebbero essere considerate interne ". Il fatto che Pandas non abbia un '__all__' che esclude' np' o 'importa numpy come _np' non è l'ideale (anche se non nella misura in cui lo definirei un bug), ma non lo fa ancora significa che i nomi esposti per sbaglio non documentati fanno parte dell'interfaccia pubblica. – abarnert

+2

Oltre a ciò che è già stato detto, non vi è alcun impatto sulle prestazioni per reimportare 'numpy', poiché Python memorizza nella cache le importazioni. –

risposta

10

si dovrebbe usare il secondo approccio per almeno quattro ragioni:

  1. Come @abarnert detto nei commenti, che segue le linee guida ufficiali per il codice Python come indicato nel PEP 0008 sotto Public and internal interfaces. Nello specifico, il PEP dice:

    Tutte le interfacce non documentate devono essere considerate interne.

    e:

    nomi importati dovrebbe sempre essere considerato un dettaglio di implementazione. Altri moduli non devono contare su accesso indiretto a tali nomi importati a meno che non sono una parte esplicitamente documentata della API contenente del modulo, come ad esempio os.path o modulo di un pacchetto __init__ che espone funzionalità da sottomoduli.

    Perché NumPy è un aspetto non documentata della biblioteca Panda (non è menzionato in uno help(pd) né sul sito ufficiale), non dovrebbe essere considerata come una parte ufficiale del Panda.

  2. "Explicit is better than implicit" e il secondo approccio rende esplicito che stiamo usando la libreria NumPy direttamente nel codice. Il primo approccio, tuttavia, lo "scivola" attraverso la libreria di Pandas.

  3. Gli strumenti di analisi del codice non saranno in grado di vedere che il codice utilizza NumPy direttamente. Questo potrebbe generare dati falsi riguardanti il ​​tuo codice (ad esempio quali dipendenze ha).

  4. Il fatto che Pandas contenga NumPy non è altro che un dettaglio di implementazione. Il che significa che se i creatori di Panda cambiassero il loro codice interno per alterare in qualche modo questo dettaglio, tutto il tuo codice di Numpy potrebbe improvvisamente interrompersi quando davvero non dovrebbe. Numpy e Pandas sono due cose separate e dovrebbero essere trattati come tali.

+0

Non sono sicuro di # 3; Sono abbastanza sicuro che alcuni metodi di Pandas siano documentati per restituire e/o prendere in modo esplicito gli array di NumPy, e il fatto che Pandas sia costruito su NumPy è qualcosa che penso che quasi tutti credono. (Tuttavia, questo non implica che Pandas debba esportare 'numpy' come' np', ovviamente, che ritorna alle prime due risposte.) – abarnert

+0

Mi stavo spostando dal mio commento alla mia risposta. Non uso panda molto, quindi conosco solo le basi su di esso. Cambierò la formulazione per essere meno severa. – iCodez

Problemi correlati