Latest web development tutorials

modul Python3

Pada bagian sebelumnya script python interpreter untuk program kami, jika Anda keluar dan masuk dari interpreter Python, maka semua metode dan variabel yang menentukan akan menghilang.

Python menyediakan cara untuk melakukan hal ini, definisi tersebut disimpan dalam file untuk beberapa script atau contoh interpreter interaktif, file ini disebut modul.

Modul adalah definisi semua file yang berisi fungsi dan variabel yang namanya py akhiran. Modul dapat diperkenalkan ke program lain untuk menggunakan modul ini fungsi dan fungsi lainnya. Ini juga penggunaan python perpustakaan standar.

Berikut adalah contoh dari modul perpustakaan standar python digunakan.

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

import sys

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

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

Pelaksanaan hasil adalah sebagai berikut:

$ 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, impor sys diperkenalkan python perpustakaan standar modul sys.py, ini adalah pengenalan pendekatan modul.
  • 2, sys.argv adalah daftar switch baris perintah yang disertakan.
  • 3, sys.path termasuk interpreter Python secara otomatis menemukan jalan dari daftar modul yang diperlukan.

pernyataan impor

Ingin menggunakan file sumber Python, cukup melakukan pernyataan impor lain di file sumber, sintaksnya adalah sebagai berikut:

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

Ketika penafsir bertemu pernyataan impor, jika modul akan diimpor dalam path pencarian saat ini.

Path pencarian adalah seorang penerjemah pertama akan mencari daftar semua direktori. Ketika Anda ingin mengimpor dukungan modul, Anda harus memesan di bagian atas script:

file kode support.py adalah:

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

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

test.py memperkenalkan modul dukungan:

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

Contoh output di atas:

$ python3 test.py 
Hello :  w3big

Sebuah modul hanya akan diimpor sekali, tidak peduli berapa kali Anda mengeksekusi impor. Hal ini untuk mencegah modul impor dijalankan lagi dan lagi.

Ketika kita menggunakan pernyataan impor saat, Python interpreter adalah bagaimana menemukan file yang berkaitan itu?

Ini melibatkan Python path pencarian, path pencarian terdiri dari serangkaian nama direktori, Python interpreter akan berbalik dari direktori ini untuk mencari modul diperkenalkan.

Ini tampak seperti variabel lingkungan, pada kenyataannya, dapat ditentukan dengan mendefinisikan lingkungan path pencarian cara variabel.

path pencarian adalah compiler Python atau instalasi ditentukan, menginstal perpustakaan baru juga harus diubah. Path pencarian disimpan dalam variabel path modul sys, melakukan percobaan sederhana di interpreter interaktif, masukkan kode berikut:

>>> 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 adalah daftar output, yang pertama adalah string kosong '', mewakili direktori saat ini (jika dicetak dari script, Anda dapat lebih jelas melihat mana direktori), yang kita jalankan python interpreter direktori (jika script adalah direktori dimana script dijalankan).

Jadi kalau seperti saya ada di direktori saat ini dengan nama yang sama dengan file yang akan diperkenalkan ke modul, modul akan diperkenalkan untuk memblokir.

Memahami konsep path pencarian, Anda dapat memodifikasi sys.path di script untuk memperkenalkan beberapa tidak dalam path pencarian modul.

Sekarang, di direktori saat ini atau juru direktori sys.path di mana untuk membuat file fibo.py, sebagai berikut:

# 斐波那契(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

Kemudian masukkan interpreter Python, gunakan perintah berikut untuk mengimpor modul ini:

>>> import fibo

Ini tidak didefinisikan dalam fibo langsung dalam nama fungsi ditulis ke dalam tabel simbol saat ini, tetapi nama modul fibo tertulis di sana.

Anda dapat menggunakan nama modul untuk fungsi akses:

>>> 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'

Jika Anda berniat untuk menggunakan fungsi sering Anda dapat menetapkan ke nama lokal:

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


dari ... pernyataan impor

Python memungkinkan Anda untuk mengimpor pernyataan dari bagian tertentu dari namespace arus dari modul, sintaksnya adalah sebagai berikut:

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

Misalnya, untuk mengimpor fibo modul fungsi fib, menggunakan pernyataan berikut:

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

Pernyataan ini bukan modul fibo seluruh ke namespace saat ini, itu hanya akan Fibo fungsi fib Lane diperkenalkan di.



Dari ... import * pernyataan

Semua isi modul semua ke dalam namespace saat ini mungkin, hanya menggunakan pernyataan berikut:

from modname import *

Ini menyediakan cara mudah untuk mengimpor modul dalam semua proyek. Namun, pernyataan ini tidak boleh terlalu banyak digunakan.


modul mendalam

Selain modul metode definisi juga dapat mencakup kode dieksekusi. Kode-kode ini biasanya digunakan untuk menginisialisasi modul. Kode ini hanya pertama kali diperkenalkan akan dieksekusi.

Setiap modul memiliki tabel simbol independen sendiri, di dalam modul digunakan untuk semua fungsi sebagai tabel simbol global.

Oleh karena itu, penulis modul dapat aman menggunakan variabel-variabel global dalam modul tanpa khawatir tentang pengguna lain untuk terlibat dalam bunga variabel global.

Dari aspek lain, ketika Anda benar-benar tahu apa yang Anda lakukan, Anda juga dapat mengakses modul fungsi dengan modname.itemname perwakilan tersebut.

Modul dapat mengimpor modul lainnya. Dalam modul (atau script, atau di tempat lain) digunakan terutama impor untuk mengimpor modul, tentu saja, ini hanya sebuah konvensi, bukan wajib. Nama modul yang diimpor akan ditempatkan pada tabel simbol operasi saat modul.

Ada juga metode impor, impor dapat digunakan secara langsung di dalam nama modul (fungsi dari variabel) ke dalam modul operasi Anda. Sebagai contoh:

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

Metode ini tidak akan mengimpor nama modul diperkenalkan pada tabel karakter saat ini (jadi dalam hal ini di dalam, Fibo nama tidak didefinisikan).

Ini juga merupakan cara untuk menempatkan modul satu kali semua (fungsi, variabel) nama diimpor ke modul tabel karakter saat ini:

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

Ini akan mengimpor semua nama dalam, tetapi orang-orang dari satu garis bawah (_) nama tidak pada kasus ini. Dalam kebanyakan kasus, Python programmer tidak menggunakan metode ini karena nama-nama yang diperkenalkan dari sumber lain, kemungkinan untuk menutupi definisi yang ada.


__name__ atribut

Ketika sebuah modul pertama kali diperkenalkan program lain, program utama akan berjalan. Jika kita ingin diperkenalkan dalam modul, modul tidak menjalankan blok program kita dapat menggunakan atribut __name__ untuk membuat blok ini dijalankan hanya dalam modul run-time sendiri.

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

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

Jalankan output sebagai berikut:

$ python using_name.py

Program itu sendiri berjalan

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

Keterangan: Setiap modul memiliki atribut __name__, jika nilainya '__main__', ini menunjukkan bahwa modul itu sendiri berjalan, jika tidak sedang diperkenalkan.


dir () 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']

Jika tidak ada argumen yang diberikan, maka dir () fungsi akan daftar nama-nama semua saat ini didefinisikan:

>>> 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']
>>>

Standard Modul

Python itu sendiri dengan beberapa perpustakaan standar modul dalam dokumen python Perpustakaan Referensi akan diperkenalkan (yang berada di belakang "Dokumen Perpustakaan Referensi" yang).

Beberapa modul yang dibangun langsung di parser, bahasa ini meskipun tidak beberapa fitur built-in, tapi ia mampu menggunakan sangat efisien, bahkan sistem-tingkat panggilan yang tidak ada masalah.

Komponen-komponen ini dapat dikonfigurasi dalam berbagai bentuk berdasarkan pada sistem operasi yang berbeda, seperti modul winreg hanya akan tersedia untuk sistem Windows.

Perlu dicatat bahwa ada sys modul khusus, yang dibangun ke dalam setiap parser Python. Variabel sys.ps1 dan sys.ps2 mendefinisikan prompt string yang sesuai yang cepat primer dan sekunder:

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

paket

Paket dalam bentuk modul namespace manajemen Python, menggunakan "nama modul putus-putus."

Misalnya, nama modul AB, maka ia mengatakan bahwa paket A sub-modul B.

Jika menggunakan modul, Anda tidak perlu khawatir tentang variabel global di antara interaksi modul yang berbeda, seperti penggunaan nama modul bertitik dalam bentuk ini, jangan khawatir modul kasus antara perpustakaan yang berbeda dengan nama yang sama.

Sehingga penulis yang berbeda dapat memberikan NumPy modul, atau perpustakaan grafis Python.

Mari kita asumsikan Anda ingin merancang modul pengolahan suara terpadu dan file data (atau menyebutnya "paket").

Ada berbagai format yang berbeda file audio (pada dasarnya dibedakan dengan ekstensi, misalnya: wav ,: File: .aiff ,: berkas: .au,), sehingga Anda perlu memiliki satu set peningkatan modul untuk antara format yang berbeda.

Dan untuk data audio, ada banyak operasi yang berbeda (seperti pencampuran, menambahkan gema, meningkatkan fungsi equalizer untuk membuat efek stereo buatan), yang juga memerlukan seperangkat bagaimana tidak pernah menyelesaikan modul untuk menangani operasi ini.

Berikut adalah struktur paket mungkin (dalam sistem file hirarki):

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
              ...

Dalam Impor paket ketika, direktori Python sys.path berdasarkan subdirektori untuk menemukan paket ini.

Hanya direktori berisi sebuah file bernama __init__.py akan dianggap sebagai sebuah paket, terutama untuk menghindari beberapa penyalahgunaan vulgar nama (misalnya, disebut string) ceroboh mempengaruhi jalur pencarian untuk modul valid.

Dalam kasus yang paling sederhana, menempatkan kosong: File: __ init__.py itu. Tentu saja, file ini juga berisi beberapa kode inisialisasi atau (akan dijelaskan kemudian) variabel __all__.

Setiap kali pengguna dapat mengimpor hanya modul tertentu di dalam paket, seperti:

import sound.effects.echo

Ini akan mengimpor sub-modul: sound.effects.echo. Dia harus menggunakan nama lengkap untuk mengakses:

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

Metode lain untuk memperkenalkan sub-modul adalah:

from sound.effects import echo

Hal ini juga akan mengimpor sub-modul: echo, dan dia tidak membutuhkan orang awalan panjang, sehingga ia bisa menggunakan:

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

Perubahan lain langsung dimasukkan ke dalam fungsi atau variabel:

from sound.effects.echo import echofilter

Sekali lagi, metode ini akan mengimpor sub-modul: echo, dan dapat menggunakan fungsi nya echofilter ():

echofilter (input, output, delay = 0,7, perhatiannya = 4)

Perhatikan bahwa bila menggunakan dari barang impor paket dalam bentuk ini ketika sesuai item yang dapat baik di dalam paket sub-modul (sub paket), atau nama lain di dalam definisi paket, seperti fungsi, kelas atau variabel.

Sintaks pertama akan mengimpor nama item didefinisikan sebagai sebuah paket, jika tidak ditemukan, kemudian mencoba untuk mengikuti modul untuk mengimpor. Jika tidak ditemukan, selamat, seorang: exc: ImportError eksepsi dilemparkan.

Sebaliknya, jika Anda menggunakan formulir ini sebagai impor item.subitem.subsubitem mengimpor bentuk, kecuali yang terakhir, itu harus paket, tetapi yang terakhir bisa menjadi modul atau paket tapi tidak bisa menjadi nama kelas, fungsi atau variabel .


Impor dari sebuah paket *

Bayangkan jika kita gunakan dari sound.effects mengimpor * Apa yang akan terjadi?

Python akan memasuki sistem file, menemukan paket yang semua sub-modul, satu per satu, semua dari mereka untuk datang ke.

Namun sayangnya, metode ini bekerja pada platform Windows sangat tidak baik, karena Windows adalah sistem case-sensitive.

Pada platform ini, tidak ada yang bisa menjamin disebut berkas ECHO.py diimpor sebagai gema modul atau Echo atau ECHO.

(Sebagai contoh, Windows 95 sangat menjengkelkan untuk memanfaatkan huruf pertama dari setiap file ditampilkan) dan DOS 8 + 3 konvensi penamaan akan berurusan dengan isu nama modul lama lebih kusut.

Untuk mengatasi masalah ini, satu-satunya masalah penulis paket untuk menyediakan indeks akurat dari paket.

pernyataan impor mengikuti aturan: Jika file definisi paket yang disebut __init__.py ada __all__ daftar variabel, menggunakan dari paket import * waktu untuk menempatkan semua nama dalam daftar ini sebagai konten paket impor.

Sebagai penulis paket, jangan lupa setelah paket pembaruan untuk memastikan __all__ ah juga diperbarui. Anda mengatakan saya tidak akan melakukannya, saya tidak akan menggunakan Impor * penggunaan ini, oke, tidak ada masalah, mengapa tidak Anda lakukan bos. Berikut adalah contoh, di: File: suara / efek / __ init__.py berisi kode berikut:

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

Ini berarti bahwa ketika Anda menggunakan penggunaan ini dari sound.effects mengimpor *, Anda akan mengimpor paket dalam tiga sub-modul.

Jika __all__ benar-benar tidak didefinisikan, kemudian gunakan sintaks ini dari sound.effects impor * waktu, itu tidak mengimpor sub-modul di sound.effects paket. Dia hanya menempatkan semua isi paket dan sound.effects yang didefinisikan dalam untuk datang ke (didefinisikan dapat menjalankan kode inisialisasi __init__.py).

Ini akan __init__.py yang mendefinisikan semua nama-nama untuk datang ke. Dan ia tidak akan menghancurkan semua modul secara eksplisit ditentukan sebelum kami memperkenalkan kalimat ini. Lihatlah ini bagian dari kode:

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

Dalam contoh ini, sebelum eksekusi dari ... impor, paket sound.effects gema dan modul surround yang diimpor ke dalam namespace saat ini. (Tentu saja, bahkan jika Anda menentukan __all__ tidak ada masalah)

Biasanya kita tidak menganjurkan penggunaan * metode ini untuk mengimpor modul, karena sering metode ini akan mengakibatkan berkurangnya mudah dibaca. Tapi ini benar-benar keystroke dapat menghemat banyak usaha, dan beberapa modul dirancang untuk menjadi satu-satunya impor melalui metode tertentu.

Ingat, menggunakan dari Paket impor specific_submodule metode ini tidak akan pernah salah. Bahkan, ini adalah metode yang direkomendasikan. Kecuali jika Anda ingin mengimpor sub-modul dan sub-modul mungkin memiliki paket lain dengan nama yang sama.

Jika struktur paket adalah sub-paket (seperti contoh untuk paket adalah suara), dan Anda ingin mengimpor saudara paket (paket tingkat yang sama) Anda harus menggunakan path absolut impor untuk mengimpor. Misalnya, jika Anda ingin menggunakan modul modul sound.filters.vocoder paket sound.effects echo, Anda harus menulis dari sound.effects impor echo.

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

Apakah impor relatif implisit atau eksplisit yang dari awal modul saat ini. Nama modul utama adalah selalu "__main__", modul utama aplikasi Python, Anda harus selalu menggunakan referensi path absolut.

Paket juga memberikan __path__ properti tambahan. Ini adalah daftar direktori, yang masing-masing memiliki sebuah direktori yang berisi paket untuk __init__.py layanan ini, Anda harus dilaksanakan sebelum lainnya didefinisikan dalam __init__.py oh. Variabel ini dapat dimodifikasi untuk pengaruh di dalam modul termasuk dalam paket dan paket anak.

Fitur ini tidak umum digunakan, biasanya digunakan untuk memperpanjang paket di dalam modul.