
In Python, puoi importare la libreria standard, i pacchetti installati con pip, i tuoi pacchetti e così via, con l’istruzione import.
In questo articolo vengono descritti i seguenti contenuti.
- Moduli, pacchetti e librerie in Python
- Utilizzo di base dell’importazione
- Come scrivere importa come consigliato in PEP8
- Importa funzioni, variabili, classi, ecc.:
from ... import ...
- Importa con un alias:
import ... as ...
- Importa da pacchetti
- Errori comuni relativi all’importazione
- Errore modulo non trovato
- AttributeError
Vedere l’articolo seguente per il percorso di ricerca del modulo.
Moduli, pacchetti e librerie in Python
Moduli
In Python, un modulo è un file che definisce funzioni, classi, ecc.
Pacchi
La directory contenente i moduli e __init__.py è chiamata “pacchetti regolari”. __init__.py può essere un file vuoto.
In Python 3.3 e versioni successive, le directory che non contengono __init__.py possono importate come pacchetti. Tali pacchetti sono chiamati “pacchetti dello spazio dei nomi”.
Biblioteche
se non sono rigorosamente definiti, pacchetti e moduli sono chiamati a volte librerie.
Utilizzo di base dell’importazione
Ad esempio, importa il modulo matematico.
Con import , un modulo viene importato come oggetto del tipo di modulo. Puoi controllare quale file è importato con print().
import math
print(type(math))
# <class 'module'>
print(math)
# <module 'math' from '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so'>
È possibile utilizzare funzioni e variabili definite nel modulo con ., .,
print(math.radians(180))
# 3.141592653589793
print(type(math.radians))
# <class 'builtin_function_or_method'>
print(math.pi)
# 3.141592653589793
print(type(math.pi))
# <class 'float'>
Se si desidera utilizzare direttamente le funzioni o le variabili di un modulo, utilizzare da utilizzare di seguito. Nota che importa. generi un errore.
Come scrivere importa come consigliato in PEP8
PEP8, la guida allo stile di Python, descrivi come scrivere l’istruzione import.
Nota che questa è solo una guida di stile, quindi non ci sono errori anche se non la scrivi in questo modo.
Importa più moduli
È possibile scrivere più moduli separati da virgole dopo l’istruzione import, ma questo non è consigliato in PEP8. Le camere separate di solito dovrebbero essere su linee.
# NG
import os, sys
# OK
import os
import sys
Se usi da per importare funzioni, variabili, classi, ecc., come spiegato di seguito, puoi separarle con una virgola.
from math import pi, radians
Ordine dei moduli
Si consiglia di raggruppare e importare i moduli nel seguente ordine, a seconda del tipo. Separa ogni gruppo con una riga vuota.
- Standard di libreria
- Librerie di terze parti
- Biblioteche locali
pur non sia scritto in PEP8, ogni modulo in un gruppo è spesso ordinato in ordine alfabetico.
import math
import os
import sys
import Requests
import my_package1
import my_package2
Importa funzioni, variabili, classi, ecc.:from ... import ...
È possibile specificare e importare funzioni, variabili, classi, ecc. definito nel modulo con da … import ….
Importa un solo elemento
È possibile importare funzioni e così via da import.
Gli articoli importati possono essere utilizzati direttamente con . Il modulo stesso non viene importato. Error NameError viene generato quando si tenta di utilizzare altri elementi.
from math import pi
print(pi)
# 3.141592653589793
# print(math.radians(180))
# NameError: name 'math' is not defined
Importa più elementi contemporaneamente
Puoi importare più funzioni, variabili, ecc. dallo stesso modulo contemporaneamente scrivendole separate da virgole.
from math import pi, radians
print(pi)
# 3.141592653589793
print(radians(180))
# 3.141592653589793
Se una linea è troppo lunga, puoi usare le parentesi () per interrompere la linea.
from math import (
e,
exp
)
print(e)
# 2.718281828459045
print(exp(1))
# 2.718281828459045
Importa tutti gli articoli con * (non consigliato)
Con * vengono importate tutte le funzioni, variabili, ecc. definito nel modulo.
from math import *
print(pi)
# 3.141592653589793
print(cos(0))
# 1.0
print(sin(0))
Se __all__ è definito in un modulo, vengono importati solo i nomi in __all__.
Si noti che l’importazione utilizzando * non è consigliata in PEP8 perché non è chiaro quale nome esiste in quale dei nomi.
Importa con un alias:import ... as ...
Puoi usare come per importare con un alias. Se viene fornito un alias, il nome originale non può essere utilizzato.
Esempio di dare un alias a un modulo:
import math as m
print(m.pi)
# 3.141592653589793
# print(math.pi)
# NameError: name 'math' is not defined
Esempio di dare un alias a una variabile:
from math import pi as PI
print(PI)
# 3.141592653589793
# print(pi)
# NameError: name 'pi' is not defined
Alcune librerie, come NumPy e Pandas, sono abitualmente importate con nomi abbreviati.
import numpy as np
import pandas as pd
Importa da pacchetti
Quando importi moduli da un pacchetto, devi fare attenzione a come importarli, a seconda della loro struttura e __init__.py.
Fondamentalmente, la documentazione ti dice come importare i file, quindi segui semplicemente le istruzioni. Ecco degli esempi per spiegare che ci sono vari modelli.
urllib
Ad esempio, importa moduli e classi dalla libreria standard, urllib.
I file (moduli) vengono archiviati nella directory urllib come segue. __init__.py è vuoto.
urllib/
├── __init__.py
├── error.py
├── parse.py
├── request.py
├── response.py
└── robotparser.py
Se scrivi import urllib, non puoi utilizzare i moduli sotto di esso. Ad esempio, urllib.error genera un errore AttributeError.
import urllib
print(type(urllib))
# <class 'module'>
print(urllib)
# <module 'urllib' from '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/__init__.py'>
# print(urllib.error)
# AttributeError: module 'urllib' has no attribute 'error'
Devi importare i moduli con importare ..
import urllib.error
print(urllib.error)
# <module 'urllib.error' from '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/error.py'>
print(urllib.error.HTTPError)
# <class 'urllib.error.HTTPError'>
Puoi anche scrivere da import .
from urllib import error
print(error)
# <module 'urllib.error' from '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/error.py'>
print(error.HTTPError)
# <class 'urllib.error.HTTPError'>
È anche possibile specificare una classe definita nel modulo e importarla.
from urllib.error import HTTPError
print(HTTPError)
# <class 'urllib.error.HTTPError'>
Nota che se il codice per l’inizializzazione non è scritto in __init__.py in questo modo, devi importare il modulo sotto di esso.
Se stai usando IPython/Jupyter Notebook, puoi usare urllib.parse semplicemente importando urllib. Questo comportamento è causato dal processo di avvio di IPython.
collezioni
Come esempio diverso, introduci le raccolte.
La directory delle raccolte è composta da quanto segue.
collections/
├── __init__.py
└── abc.py
Nelle raccolte, classi come Counter e OrderedDict sono definiti in __init__.py invece di memorizzare file di modulo come urllib.
In tal caso, quando importi un pacchetto, puoi utilizzare la classe come ..
import collections
print(collections)
# <module 'collections' from '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/collections/__init__.py'>
print(collections.Counter)
# <class 'collections.Counter'>
Non puoi importare classi con ..
# import collections.Counter
# ModuleNotFoundError: No module named 'collections.Counter'
Puoi importare classi con da.
from collections import Counter
print(Counter)
# <class 'collections.Counter'>
NumPy
Esempio di una libreria di terze parti, NumPy:
In NumPy, ogni sottopacchetto viene importato in __init__.py nella directory numpy.
Non è necessario importare ogni modulo. Basta scrivere import numpy come np per utilizzare varie funzioni.
scikit-imparare
Il caso di scikit-learn è diverso.
scikit-learn non importa i sottopacchetti in __init__.py nella directory sklearn.
È necessario importare i sottopacchetti in modo esplicito, come segue.
from sklearn import datasets, model_selection, svm, metrics
Errore modulo non trovato
Errore che il modulo non può essere trovato.
ModuleNotFoundError: No module named 'xxx'
Il nome del modulo o il percorso di ricerca del modulo potrebbe essere errato.
Come mostrato nell’esempio delle raccolte sopra, ModuleNotFoundError viene generato anche quando si tenta di importare una classe anziché un modulo. Usa da per importare una funzione o una classe.
AttributeError
Errore che il modulo importato non ha l’attributo specificato.
AttributeError: module 'xxx' has no attribute 'yyy'
È possibile che il file corretto non sia importato.
Ad esempio, quando si scrive import , la prima priorità per la ricerca del modulo è la stessa directory del file di script, quindi eseguito se nella directory è presente un file denominato .py, quel file viene importato.
Usa print() per verificare se il file è stato importato dalla posizione prevista e, in caso contrario, rinominare o spostare il file.