Python Language
Importowanie modułów
Szukaj…
Składnia
- import nazwa_modułu
- import nazwa_modułu.submodule_name
- z importu nazwa_modułu *
- od Nazwa_modułu importu submodule_name [, CLASS_NAME, Nazwa_funkcji, ... itd]
- od Nazwa_modułu importu some_name jako NEW_NAME
- od module_name.submodule_name importu CLASS_NAME [, Nazwa_funkcji, ... itd]
Uwagi
Zaimportowanie modułu spowoduje, że Python oceni cały kod najwyższego poziomu w tym module, dzięki czemu pozna wszystkie funkcje, klasy i zmienne zawarte w module. Jeśli chcesz, aby Twój moduł został zaimportowany gdzie indziej, uważaj na kod najwyższego poziomu i obuduj go, if __name__ == '__main__': jeśli nie chcesz, aby był on wykonywany podczas importowania modułu.
Importowanie modułu
Użyj instrukcji import :
>>> import random
>>> print(random.randint(1, 10))
4
import module importu zaimportuje moduł, a następnie umożliwi odwołanie się do jego obiektów - na przykład wartości, funkcji i klas - przy użyciu składni module.name . W powyższym przykładzie random moduł jest importowany, który zawiera funkcję randint . Importując random , możesz wywołać randint pomocą random.randint .
Możesz zaimportować moduł i przypisać go do innej nazwy:
>>> import random as rn
>>> print(rn.randint(1, 10))
4
Jeśli plik main.py znajduje się w tym samym folderze co custom.py . Możesz go zaimportować w następujący sposób:
import custom
Możliwe jest również zaimportowanie funkcji z modułu:
>>> from math import sin
>>> sin(1)
0.8414709848078965
Aby zaimportować określone funkcje głębiej do modułu, operator kropki może być używany tylko po lewej stronie słowa kluczowego import :
from urllib.request import urlopen
W Pythonie mamy dwa sposoby na wywołanie funkcji z najwyższego poziomu. Jeden jest import a drugi pochodzi from . Powinniśmy użyć import gdy mamy możliwość kolizji nazw. Załóżmy, że mamy pliki hello.py i world.py o tej samej funkcji o nazwie function . Wtedy instrukcja import będzie działać dobrze.
from hello import function
from world import function
function() #world's function will be invoked. Not hello's
Ogólnie rzecz biorąc, import zapewni ci przestrzeń nazw.
import hello
import world
hello.function() # exclusively hello's function will be invoked
world.function() # exclusively world's function will be invoked
Ale jeśli jesteś tego pewien, w całym projekcie nie ma takiej samej nazwy funkcji, której powinieneś użyć from instrukcji
W tym samym wierszu można wykonać wiele importów:
>>> # Multiple modules
>>> import time, sockets, random
>>> # Multiple functions
>>> from math import sin, cos, tan
>>> # Multiple constants
>>> from math import pi, e
>>> print(pi)
3.141592653589793
>>> print(cos(45))
0.5253219888177297
>>> print(time.time())
1482807222.7240417
Słowa kluczowe i składnia przedstawione powyżej mogą być również używane w kombinacjach:
>>> from urllib.request import urlopen as geturl, pathname2url as path2url, getproxies
>>> from math import factorial as fact, gamma, atan as arctan
>>> import random.randint, time, sys
>>> print(time.time())
1482807222.7240417
>>> print(arctan(60))
1.554131203080956
>>> filepath = "/dogs/jumping poodle (december).png"
>>> print(path2url(filepath))
/dogs/jumping%20poodle%20%28december%29.png
Importowanie określonych nazw z modułu
Zamiast importować cały moduł, możesz importować tylko określone nazwy:
from random import randint # Syntax "from MODULENAME import NAME1[, NAME2[, ...]]"
print(randint(1, 10)) # Out: 5
from random jest potrzebne, ponieważ interpreter Pythona musi wiedzieć, z którego zasobu powinien zaimportować funkcję lub klasę, a import randint określa funkcję lub klasę.
Kolejny przykład poniżej (podobny do powyższego):
from math import pi
print(pi) # Out: 3.14159265359
Poniższy przykład zgłosi błąd, ponieważ nie zaimportowaliśmy modułu:
random.randrange(1, 10) # works only if "import random" has been run before
Wyjścia:
NameError: name 'random' is not defined
Interpretator python nie rozumie, co masz na myśli przez random . Należy to zadeklarować, dodając import random do przykładu:
import random
random.randrange(1, 10)
Importowanie wszystkich nazw z modułu
from module_name import *
na przykład:
from math import *
sqrt(2) # instead of math.sqrt(2)
ceil(2.7) # instead of math.ceil(2.7)
Spowoduje to zaimportowanie wszystkich nazw zdefiniowanych w module math do globalnej przestrzeni nazw, innych niż nazwy rozpoczynające się znakiem podkreślenia (co oznacza, że pisarz uważa, że jest on wyłącznie do użytku wewnętrznego).
Ostrzeżenie : jeśli funkcja o tej samej nazwie została już zdefiniowana lub zaimportowana, zostanie zastąpiona . Prawie zawsze importując tylko określone nazwy from math import sqrt, ceil jest zalecanym sposobem :
def sqrt(num):
print("I don't know what's the square root of {}.".format(num))
sqrt(4)
# Output: I don't know what's the square root of 4.
from math import *
sqrt(4)
# Output: 2.0
Importowanie z gwiazdką jest dozwolone tylko na poziomie modułu. Próby wykonania ich w definicjach klas lub funkcji powodują błąd SyntaxError .
def f():
from math import *
i
class A:
from math import *
oba kończą się niepowodzeniem z:
SyntaxError: import * only allowed at module level
Zmienna specjalna __all__
Moduły mogą mieć specjalną zmienną o nazwie __all__ aby ograniczyć to, które zmienne są importowane podczas korzystania from mymodule import * .
Biorąc pod uwagę następujący moduł:
# mymodule.py
__all__ = ['imported_by_star']
imported_by_star = 42
not_imported_by_star = 21
Tylko imported_by_star jest importowany przy korzystaniu from mymodule import * :
>>> from mymodule import *
>>> imported_by_star
42
>>> not_imported_by_star
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'not_imported_by_star' is not defined
Jednak not_imported_by_star można importować jawnie:
>>> from mymodule import not_imported_by_star
>>> not_imported_by_star
21
Programowe importowanie
Aby zaimportować moduł za pomocą wywołania funkcji, użyj modułu importlib (zawartego w Pythonie od wersji 2.7):
import importlib
random = importlib.import_module("random")
Funkcja importlib.import_module() również importuje bezpośrednio submoduł pakietu:
collections_abc = importlib.import_module("collections.abc")
W przypadku starszych wersji Pythona użyj modułu imp .
Użyj funkcji imp.find_module i imp.load_module aby wykonać programowy import.
Zaczerpnięte ze standardowej dokumentacji biblioteki
import imp, sys
def import_module(name):
fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
NIE używaj __import__() do programowego importowania modułów! Istnieją subtelne szczegóły dotyczące sys.modules , argumentu fromlist itp., fromlist łatwo przeoczyć, które obsługuje importlib.import_module() .
Importuj moduły z dowolnej lokalizacji systemu plików
Jeśli chcesz zaimportować moduł, który jeszcze nie istnieje jako moduł wbudowany w Bibliotece standardowej Python ani jako pakiet boczny, możesz to zrobić, dodając ścieżkę do katalogu, w którym znajduje się moduł sys.path Może to być przydatne, gdy na hoście istnieje wiele środowisk Python.
import sys
sys.path.append("/path/to/directory/containing/your/module")
import mymodule
Ważne jest, aby dołączyć ścieżkę do katalogu, w którym znajduje się mymodule , a nie ścieżkę do samego modułu.
Reguły PEP8 dla importów
Niektóre zalecane wytyczne w stylu PEP8 dotyczące importu:
Import powinien odbywać się w osobnych wierszach:
from math import sqrt, ceil # Not recommended from math import sqrt # Recommended from math import ceil
Zamów import w następujący sposób u góry modułu:
- Standardowy import biblioteki
- Powiązany import stron trzecich
- Lokalne importy specyficzne dla aplikacji / biblioteki
Należy unikać importowania symboli wieloznacznych, ponieważ prowadzi to do pomyłek w nazwach w bieżącej przestrzeni nazw. Jeśli robisz to
from module import *, może być niejasne, czy konkretna nazwa w kodzie pochodzi odmoduleczy nie. Jest to podwójnie prawdziwe, jeśli masz wiele instrukcjifrom module import *typufrom module import *.Unikaj korzystania z importu względnego; zamiast tego użyj jawnego importu.
Importowanie submodułów
from module.submodule import function
Ta function importuje z module.submodule .
Funkcja __import __ ()
Za __import__() funkcji __import__() można importować moduły, których nazwa jest znana tylko w czasie wykonywania
if user_input == "os":
os = __import__("os")
# equivalent to import os
Tej funkcji można również użyć do określenia ścieżki pliku do modułu
mod = __import__(r"C:/path/to/file/anywhere/on/computer/module.py")
Ponowny import modułu
Korzystając z interaktywnego interpretera, możesz chcieć ponownie załadować moduł. Może to być przydatne, jeśli edytujesz moduł i chcesz zaimportować najnowszą wersję lub jeśli załatałeś małpy element istniejącego modułu i chcesz przywrócić zmiany.
Pamiętaj, że nie możesz po prostu ponownie import modułu, aby przywrócić:
import math
math.pi = 3
print(math.pi) # 3
import math
print(math.pi) # 3
Wynika to z faktu, że interpreter rejestruje każdy importowany moduł. A kiedy próbujesz ponownie zaimportować moduł, tłumacz widzi go w rejestrze i nic nie robi. Tak więc trudnym sposobem na ponowny import jest użycie import po usunięciu odpowiedniego elementu z rejestru:
print(math.pi) # 3
import sys
if 'math' in sys.modules: # Is the ``math`` module in the register?
del sys.modules['math'] # If so, remove it.
import math
print(math.pi) # 3.141592653589793
Ale jest więcej prosty i prosty sposób.
Python 2
Użyj funkcji reload :
import math
math.pi = 3
print(math.pi) # 3
reload(math)
print(math.pi) # 3.141592653589793
Python 3
Funkcja reload została przeniesiona do importlib :
import math
math.pi = 3
print(math.pi) # 3
from importlib import reload
reload(math)
print(math.pi) # 3.141592653589793