Latest web development tutorials

moduł Python3

W poprzednich odcinkach skryptu jest interpreter Pythona nas zaprogramować, jeśli wyjść i wejść od interpretera Pythona, to wszystkie metody i zmienne definiujące zniknie.

Python to sposób, aby to zrobić, te definicje zapisane w pliku dla niektórych skryptów lub interaktywnej przykład tłumacza, plik ten nazywany jest modułem.

Moduł jest zdefiniowanie wszystkich plików, które zawiera funkcje i zmienne, których nazwa przyrostek .py. Moduły mogą być wprowadzone do innych programów, które korzystają z tego modułu funkcji i innych funkcji. Jest to również wykorzystanie standardowej biblioteki Pythona.

Oto przykład modułów biblioteki standardowych pyton stosowane.

#!/usr/bin/python3
# 文件名: using_sys.py

import sys

print('命令行参数如下:')
for i in sys.argv:
   print(i)

print('\n\nPython 路径为:', sys.path, '\n')

Realizacja wyniki przedstawiają się następująco:

$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2


Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 

  • 1, import sys wprowadzone standardowej biblioteki Pythona moduł sys.py, to jest wprowadzenie podejścia modułu.
  • 2, sys.argv jest lista przełączników wiersza polecenia są uwzględniane.
  • 3, sys.path zawiera interpreter Pythona automatycznie znaleźć ścieżkę do listy modułów wymaganych.

instrukcja import

Chcesz skorzystać z pliku źródłowego Pythona, wystarczy wykonać inną instrukcję import z pliku źródłowego, składnia jest następująca:

import module1[, module2[,... moduleN]

Gdy interpreter napotka instrukcji import, jeśli moduł zostanie przywieziony w bieżącej ścieżce wyszukiwania.

Ścieżka przeszukiwania jest interpreter będzie najpierw sprawdzić listę wszystkich katalogów. Jak chcesz zaimportować wsparcia modułu, trzeba zamówić na początku skryptu:

support.py Kod plik jest:

#!/usr/bin/python3
# Filename: support.py

def print_func( par ):
    print ("Hello : ", par)
    return

test.py wprowadzono moduł obsługi:

#!/usr/bin/python3
# Filename: test.py
 
# 导入模块
import support
 
# 现在可以调用模块里包含的函数了
support.print_func("w3big")

Przykłady wyżej wyjścia:

$ python3 test.py 
Hello :  w3big

Moduł zostaną zaimportowane tylko raz, bez względu na to ile razy można wykonać import. Zapobiega to moduł importu jest wykonywany w kółko.

Gdy używamy instrukcji import, gdy interpreter Pythona jest, jak znaleźć odpowiedni plik jest?

Wiąże ścieżki wyszukiwania Pythona, ścieżka wyszukiwania składa się z szeregu nazw katalogów, interpreter Pythona zmieni się z tych katalogów, aby szukać modułów wprowadzonych.

To wygląda zmiennej środowiskowej, w rzeczywistości może być określona przez zdefiniowanie zmiennej środowiskowej PATH wyszukiwania sposób.

Szukaj ścieżka jest kompilator Pythona lub instalacji określona, ​​należy zainstalować nową bibliotekę powinny również zostać zmienione. Ścieżka przeszukiwania jest przechowywany w zmiennej ścieżki modułu sys, zrobić prosty eksperyment, w interaktywny interpreter, wprowadź następujący kod:

>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>> 

sys.path to lista wyjścia, z których pierwszy jest pusty ciąg '', reprezentuje bieżący katalog (jeśli wydrukowana ze skryptu, można bardziej wyraźnie zobaczyć, które katalogu), które wykonujemy interpreter Pythona katalog (jeśli skrypt jest katalogiem, w którym skrypt jest uruchamiany).

Więc jeśli tak jak ja istnieje w bieżącym katalogu o tej samej nazwie co plik który ma zostać wprowadzony do modułu, moduł zostanie wprowadzony w celu zagłuszenia.

Zrozumieć koncepcję ścieżki wyszukiwania, można zmodyfikować sys.path w skrypcie przedstawić niektóre nie w ścieżce wyszukiwania modułu.

Teraz, w bieżącym katalogu lub tłumacza sys.path katalog, w którym, aby utworzyć plik fibo.py, co następuje:

# 斐波那契(fibonacci)数列模块

def fib(n):    # 定义到 n 的斐波那契数列
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): # 返回到 n 的斐波那契数列
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

Następnie wprowadź interpreter Pythona, należy użyć następującego polecenia, aby zaimportować ten moduł:

>>> import fibo

To nie jest zdefiniowane w fibo bezpośrednio w nazwie funkcji jest napisane w bieżącej tablicy symboli, ale nazwa modułu fibo tam napisane.

Można użyć nazwy modułu dostęp do funkcji:

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Jeśli masz zamiar użyć funkcji często można przypisać go do lokalnej nazwie:

>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377


od instrukcji import ...

Python pozwala na importowanie oświadczenie z określonej części obecnego obszaru nazw z modułu, składnia jest następująca:

from modname import name1[, name2[, ... nameN]]

Na przykład, aby zaimportować Fibo modułu funkcji fib należy stosować następujące oświadczenie:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Stwierdzenie to nie jest cały moduł fibo do bieżącej przestrzeni nazw, to fibo tylko funkcję fib Lane wprowadzone.



Od ... import rachunku *

Cała zawartość modułu są do bieżącej przestrzeni nazw są możliwe, wystarczy użyć następujące oświadczenie:

from modname import *

Zapewnia to łatwy sposób zaimportować moduł we wszystkich projektach. Jednak to stwierdzenie nie powinno być zbyt dużo do użycia.


moduł głębokość

Ponadto do modułu rozdzielczości metody mogą także zawierać kod wykonywalny. Kody te są powszechnie stosowane w celu zainicjowania modułu. Ten kod jest po raz pierwszy wprowadzony dopiero będą realizowane.

Każdy moduł posiada własny niezależny tablicę symboli, wewnętrzny moduł do wykorzystania dla wszystkich funkcji jako globalnego tablicy symboli.

Dlatego autor modułu może bezpiecznie korzystać z tych zmiennych globalnych w module bez martwienia się o innych użytkowników, aby zaangażować się w zmiennych globalnych kwiatów.

Z innego aspektu, gdy naprawdę wiesz co robisz, można również uzyskać dostęp do modułu funkcyjnego przez modname.itemname takiej reprezentacji.

Moduły mogą importować inne moduły. W modułu (lub skryptu, czy gdzie indziej) wszystkim użytku Importuj, aby zaimportować moduł, oczywiście, jest to tylko konwencja, a nie obowiązkowe. Nazwa importowanego module umieszcza się w tablicy symboli w trybie pracy modułu.

Istnieje również metoda importu, import może być stosowany bezpośrednio w nazwę modułu (funkcja zmiennych) do aktualnej modułu operacyjnego. Na przykład:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Ta metoda nie będzie importować nazwę modułu wprowadza się w bieżącej tabeli znaków (czyli w tym przypadku wewnątrz, fibo nazwa nie jest określona).

Jest to również sposób umieścić moduł jednorazową wszystkie (funkcja, zmienna) nazwy są importowane do bieżącego modułu tablica znaków:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Pozwoli to zaimportować wszystkie nazwy są, ale te z jednym podkreślenia (_) nazwa nie jest w tej sprawie. W większości przypadków, programiści Python nie korzystać z tej metody, ponieważ nazwy wprowadzone z innych źródeł, może obejmować istniejącą definicję.


atrybut __name__

Gdy moduł jest pierwszy wprowadzony inny program, główny program zostanie uruchomiony. Jeśli chcemy być wprowadzone w module, moduł nie wykonuje blok programu, możemy użyć atrybutu __name__ aby ten blok jest wykonywany tylko w module run-time samego.

#!/usr/bin/python3
# Filename: using_name.py

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

Uruchom następujące dane wyjściowe:

$ python using_name.py

Sam program jest uruchomiony

$ python
>>> import using_name
我来自另一模块
>>>

Opis: Każdy moduł posiada atrybut __name__, gdy jej wartość jest "__main__", oznacza to, że moduł jest sam w sobie działa, w przeciwnym razie jest on wprowadzony.


reż function ()

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
</p>
<pre>
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
 '__package__', '__stderr__', '__stdin__', '__stdout__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
 '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
 'call_tracing', 'callstats', 'copyright', 'displayhook',
 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
 'thread_info', 'version', 'version_info', 'warnoptions']

Jeżeli nie podano żadnych argumentów, to funkcja dir () będzie wymienić nazwy wszystkich aktualnie zdefiniowane:

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir() # 得到一个当前模块中定义的属性列表
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
>>> a = 5 # 建立一个新的变量 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>>
>>> del a # 删除变量名a
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>>

Standardowy moduł

Python sam z niektórymi standardowej biblioteki modułów w dokumencie Python Library Reference zostaną wprowadzone do (czyli za "Library Reference Document").

Niektóre moduły są wbudowane bezpośrednio w składni, języki te choć nie pewne wbudowane funkcje, ale był w stanie wykorzystać bardzo wydajne, a nawet rozmowy na poziomie systemu nie są problemem.

Składniki te mogą być skonfigurowane w różnych formach opartych na różnych systemach operacyjnych, takich jak moduł winreg będą dostępne tylko w systemie Windows.

Należy zauważyć, że nie jest specjalny moduł sys, który jest wbudowany w każdy Python parser. Zmienne sys.ps1 i sys.ps2 określa pierwotne i wtórne szybkiej szybkiej odpowiedni ciąg znaków:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>

pakiet

Opakowanie w postaci modułu nazw Python zarządzania, używając "przerywane nazwy modułów".

Na przykład, nazwa modułu jest AB, a następnie powiedział, że pakiet sub-module B.

W przypadku korzystania z modułu, nie trzeba się martwić o zmiennych globalnych interakcji pomiędzy różnymi modułami, podobnie jak korzystanie z przerywanymi nazw modułów w tej formie, nie martw moduł sprawy między różnymi bibliotekami o tej samej nazwie.

Tak, że różni autorzy mogą dostarczyć moduł NumPy lub Python biblioteki graficznej.

Załóżmy, że chcesz zaprojektować ujednolicony moduł przetwarzania głosu i plik danych (lub nazywają to "pakiet").

Istniejące wiele różnych formatów plików audio (w zasadzie wyróżnić co za tym idzie, na przykład: .wav ,: plików: .aiff ,: plików: au,), więc trzeba mieć zestaw wzrostem modułu do między różnymi formatami.

A dla danych audio, istnieje wiele różnych czynności (takie jak mieszanie, dodawanie echa, zwiększyć funkcję korektora stworzyć sztuczny efekt stereo), które muszą również zestaw, jak nigdy nie zakończyć moduły do ​​obsługi tych operacji.

Oto możliwe Struktura pakietu (w hierarchicznym systemie plików):

sound/                          顶层包
      __init__.py               初始化 sound 包
      formats/                  文件格式转换子包
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  声音效果子包
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  filters 子包
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

W imporcie pakietu, gdy katalogów Python sys.path oparciu o podkatalogu znaleźć ten pakiet zawiera.

Jedynie katalog zawiera plik o nazwie __init__.py będą traktowane jako pakiet, głównie w celu uniknięcia niektórych z wulgarnym nadużywania nazwy (na przykład o nazwie string) nieostrożne wpływ na ścieżkę przeszukiwania do ważnego modułu.

W najprostszym przypadku, umieścić pusty: file: __ init__.py niego. Oczywiście, plik ten może również zawierać jakiś kod inicjujący lub zostanie (zostaną opisane później) zmienną __all__.

Za każdym razem gdy użytkownik może importować tylko określony moduł wewnątrz opakowania, takiego jak:

import sound.effects.echo

Pozwoli to zaimportować submodułów: sound.effects.echo. Musi użyć pełnej nazwy dostępu:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

Inną metodą wprowadzenia podmodułów są:

from sound.effects import echo

Będzie również importować submodułów: echo, a on nie potrzebuje długich prefiks, aby mógł korzystać z:

echo.echofilter(input, output, delay=0.7, atten=4)

Kolejną zmianą jest bezpośrednio wprowadzany do funkcji lub zmiennej:

from sound.effects.echo import echofilter

Ponownie, metoda ta będzie importować submodułów: echo, i może korzystać z funkcji jego echofilter ():

echofilter (wejście, wyjście, opóźnienie = 0,7, atten = 4)

Należy pamiętać, że w przypadku korzystania z pakietu pozycji importu w tej formie, gdy odpowiedni element może być albo wewnątrz opakowania podmodułem (opakowania SUB) lub innych nazw wewnątrz definicji pakietu, takich jak funkcja, klasa lub zmiennej.

Składnia najpierw importować nazwę elementu zdefiniowanego jako pakiet, jeśli nie znaleziono, a następnie starał się moduł do importu. Jeśli nie zostanie znaleziona, gratulacje, a: exc: wyjątek ImportError jest wyrzucany.

I odwrotnie, jeśli użyć tego formularza jako import item.subitem.subsubitem zaimportować postać, z wyjątkiem ostatniego, musi to być pakiet, ale ten ostatni może być modułem lub pakietem ale nie może być nazwą klasy, funkcja lub zmienna ,


Import z opakowania *

Wyobraź sobie, że korzystamy z Sound.Effects import * Co się stało?

Python wejdzie do systemu plików, znaleźć pakiet którego wszystkie sub-moduły, jeden po drugim, wszystkie z nich zetknąć.

Niestety, ta metoda działa na platformie Windows, nie jest bardzo dobra, ponieważ system Windows to system wielkości liter.

Na tej platformie, nikt nie może wypowiedzieć się nazywa plik ECHO.py importowane jako echo modułu lub Echo czy ECHO.

(Na przykład, Windows 95 jest bardzo irytujące pierwszą literę każdego pliku jest wyświetlany) oraz DOS 8 + 3 konwencji nazewnictwa zajmie się sprawą długich nazw modułów nie więcej splątane.

Aby rozwiązać ten problem, jedynym problemem autor pakiet w celu zapewnienia dokładnego wskaźnika pakietu.

instrukcja import następujących zasad: Jeżeli plik definicji pakietu o nazwie __init__.py istnieje __all__ listę zmiennych, korzystając z pakietu import * czas, aby umieścić wszystkie nazwiska na tej liście jako import zawartości pakietu.

Jako autor pakietu, nie zapomnij po pakietu aktualizacji w celu zapewnienia __all__ również zaktualizowaną ah. Mówisz, że nie zrobi tego, nie będę używać import * takie wykorzystanie, w porządku, nie ma problemu, dlaczego nie robisz szefa. Oto przykład, w: file: dźwięki / efekty / __ init__.py zawiera następujący kod:

__all__ = ["echo", "surround", "reverse"]

Oznacza to, że podczas korzystania z tego wykorzystania z Sound.Effects import *, można zaimportować pakiet wewnątrz trzech sub-modułów.

Jeśli __all__ naprawdę nie jest zdefiniowany, a następnie użyć tej składni z Sound.Effects import * czas, to nie importuje żadnych podmodułów w Sound.Effects pakietów. On po prostu umieścić całą zawartość opakowania i jego Sound.Effects zdefiniowanej wewnątrz przyjść do (zdefiniowany może zostać uruchomiony kod __init__.py inicjalizacji).

Będzie to __init__.py który definiuje wszystkie nazwy przyjść do. I nie zniszczy wszystko wyraźnie określonego modułu zanim wprowadzono to zdanie. Spójrz na tej części kodu:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

W tym przykładzie, przed wykonaniem importu z ..., pakiet Sound.Effects echo i moduły przestrzenne są importowane do bieżącej przestrzeni nazw. (Oczywiście, nawet jeśli zdefiniujesz __all__ żaden problem)

Normalnie nie zalecają stosowanie tej metody * importowanie modułu, ponieważ często metoda ta spowoduje zmniejszenie czytelności. Ale to jest naprawdę klawiszy można zaoszczędzić sporo wysiłku, a niektóre moduły są zaprojektowane tak, aby stać się importować tylko przez określoną metodą.

Pamiętaj, że korzystając z importu pakietu specific_submodule ten sposób nigdy nie będzie źle. W rzeczywistości jest to zalecana metoda. Jeśli nie chcesz importować submodułów i sub-moduły mogą mieć inne pakiety o tej samej nazwie.

Jeśli struktura pakietu jest sub-pakiet (takie jak przykład dla pakietu jest dźwięk), a chcesz zaimportować pakiet Brothers (sam pakiet poziom) trzeba użyć importowany bezwzględną ścieżkę do importu. Na przykład, jeśli chcesz korzystać z modułów Moduł sound.filters.vocoder instalacyjne Sound.Effects echo, trzeba pisać z Sound.Effects importować echa.

from . import echo
from .. import formats
from ..filters import equalizer

Niezależnie od tego, bezpośrednia lub pośrednia importu względne są od początku bieżącego modułu. Nazwa modułu głównego jest zawsze "__main__", główny moduł aplikacji Pythona, należy zawsze używać absolutnego odniesienia ścieżki.

Pakiet zawiera również dodatkowe __path__ nieruchomości. Jest to lista katalogów, z których każdy posiada katalog zawierający pakiet dla tego __init__.py usług, trzeba być wykonywane przed inne zdefiniowane w __init__.py oh. Zmienna ta może być modyfikowana o wpływy wewnątrz modułu wliczone w pakiet, a program dla dzieci.

Funkcja ta nie jest powszechnie stosowane, na ogół stosuje się do wydłużenia pakiet wewnątrz modułu.