Hướng dẫn init py python - init py python
Trong phần 2 này, chúng ta sẽ cùng nhau tìm hiểu thêm về python package và module. 1. Python packagesMột cách đơn giản nhất, nếu module chỉ đơn thuần là file có đuôi là Packages là phương pháp để quản lý python's module namspace bằng cách sử dụng "dotted module names". Ví dụ, khi gõ module name Tương tự như việc sử dụng module để giúp người viết module không phải lo lắng là bị trùng tên biến/hàm ở các module của người khác viết, việc sử dụng dotted module names sẽ giúp người viết multi-module packages như là NumPy hay Pillow không phải lo lắng về việc bị trùng tên module với người khác.trùng tên biến/hàm ở các module của người khác viết, việc sử dụng dotted module names sẽ giúp người viết multi-module packages như là NumPy hay Pillow không phải lo lắng về việc bị trùng tên module với người khác. 2. Import statementGiả sử như bạn muốn design một collection of modules ( a "package") để xử lý các sound files và sound data. Các sound file này sẽ có rất nhiều format khác nhau (thông thường được nhận biết thông qua extension của chúng, ví dụ: 0, 1, 2), vì vậy bạn cần phải create và maintain a growing collection of modules để chuyển đổi giữa các formats khác nhau.growing collection of modules để chuyển đổi giữa các formats khác nhau.Tiếp theo, sẽ có rất nhiều tác vụ mà bạn muốn thực hiện trên sound data (ví dụ như mixing, thêm echo, áp dụng equalizer function, tạo ra các hiệu ứng âm thanh,..), như vậy, khả năng là chúng ta sẽ phải viết một loạt các module kéo dài vô tận để thực hiện các tác vụ này. Dưới đây là một cấu trúc của package mà chúng ta có thể sử dụng:
File 3 bắt buộc phải có để Python xem một directory là một package.Trong trường hợp đơn giản nhất, thì 4 có thể chỉ là một file rỗng, nhưng nó có thể được sử dụng để chạy các code khởi tạo, hoặc là để set giá trị cho biến 5 , sẽ được mô tả sau.Người dùng của package có thể import riêng rẽ từng module, ví dụ:
Một cách khác để import cái submodule:
Hoặc ta có thể tiến xa hơn nữa, import thẳng cái function vào symbol table luôn:
So sánh Với 6, cái item sẽ có thể hoặc là ✔ submodule, hoặc là ✔ subpackage, hoặc có thể là ✔ function, ✔ class hoặc ✔ variable.item sẽ có thể hoặc là ✔ submodule, hoặc là ✔ subpackage, hoặc có thể là ✔ function, ✔ class hoặc ✔ variable.
Về thứ tự, thì import statement sẽ kiểm tra xem cái tên đó có phải là một định nghĩa trong cái package đó hay không (function, class, variable), nếu không có, thì nó sẽ ngầm hiểu đây là module và thử load module. Với 7, mỗi item trừ cái cuối cùng, bắt buộc phải là một package, cái cuối cùng sẽ có thể hoặc là một ✔ module hoặc là một ✔ package, nhưng nó không thể là ❌ function, ❌ class, ❌ variable.3. Package Relative ImportsKhi mà package được cấu trúc thành các subpackages (như ví dụ cái 0 package), thì bạn sẽ có thể sử dụng absolute import để refer tới các submodules bên trong siblings packages.absolute import để refer tới các submodules bên trong siblings packages.Ví dụ, nếu module 1 cần sử dụng 2 module ở trong 3 package, ta có thể viết 4.Hoặc, ta có thể viết releative import, vẫn sử dụng dạng 5 . Nhưng chúng ta sẽ sử dụng leading dots để chỉ ra current và parent package có tham gia vào quá trình import. Ví dụ, như ta đang đứng bên trong 6 module, ta có thể import như sau:releative import, vẫn sử dụng dạng 5 . Nhưng chúng ta sẽ sử dụng leading dots để chỉ ra
current và parent package có tham gia vào quá trình import. Ví dụ, như ta đang đứng bên trong 6 module, ta có thể import như sau:
Note: với absolute import thì ta có thể sử dụng hoặc là 7 hoặc là 8. Nhưng 9 sẽ chỉ dùng dạng 8. Lý do là bởi vì, với:absolute import thì ta có thể sử dụng hoặc là 7 hoặc là 8. Nhưng 9 sẽ chỉ dùng dạng 8. Lý do là bởi vì, với:
thì 1 là một usable expression, nhưng 2 thì không phải là một valid expression.4. __all__ variableCó một câu hỏi, là chuyện gì xảy ra khi người dùng viết 3?Trường hợp lý tưởng nhất, là bên trong file 3 của package, có cung cấp danh sách tên các modules sẽ được import, sử dụng 5 variable. Ví dụ
Khi đó, interpreter sẽ chỉ import các module có name được cung cấp trong danh sách này. Trường hợp biến 5 không được định nghĩa, câu lệnh 3 sẽ KHÔNG import tất cả submodules của package sound.effects vào. Nó chỉ đảm bảo là package 3 được import, chạy tất cả code bên trong file 3, và import tất cả các names được định nghĩa trong package. Những names này bao gồm tất cả function, class, variable được định nghĩa bên trong file 3 và các submodules được explicitly loaded.Tới đây, thì ta sẽ thấy hai cách dưới đây là tương đương nhau:
Tuy cả 2 cách đều cho ra kết quả như nhau, 1 vẫn được xem là bad practice. Và 2 là cách được recommended.bad practice. Và 2 là cách được recommended.
|