2013-06-29 33 views
6

Nói rằng tôi có hai mô-đun Python:Python Phong tục: Nhập khẩu Modules

module1.py:

import module2 
def myFunct(): print "called from module1" 

module2.py:

def myFunct(): print "called from module2" 
def someFunct(): print "also called from module2" 

Nếu tôi nhập module1, nó là nghi thức tốt hơn để tái nhập khẩu module2 hoặc chỉ gọi nó là module1.module2?

Ví dụ (someotherfile.py):

import module1 
module1.myFunct() # prints "called from module1" 
module1.module2.myFunct() # prints "called from module2" 

tôi cũng có thể làm điều này: module2 = module1.module2. Bây giờ, tôi có thể gọi trực tiếp module2.myFunct().

Tuy nhiên, tôi có thể thay đổi module1.py tới:

from module2 import * 
def myFunct(): print "called from module1" 

Bây giờ, trong someotherfile.py, tôi có thể làm điều này:

import module1 
module1.myFunct() # prints "called from module1"; overrides module2 
module1.someFunct() # prints "also called from module2" 

Ngoài ra, bằng cách nhập *, giúp đỡ ('module1') cho thấy tất cả của các hàm từ module2.

Mặt khác, (giả sử module1.py sử dụng import module2), tôi có thể làm: someotherfile.py:

import module1, module2 
module1.myFunct() # prints "called from module1" 
module2.myFunct() # prints "called from module2" 

Một lần nữa, đó là nghi thức tốt hơn và thực hành? Để nhập lại module2 hoặc chỉ để tham chiếu nhập module1?

Trả lời

2

Chỉ import module2. Nhập lại là tương đối không tốn kém, vì Python lưu trữ các đối tượng mô-đun trong sys.modules.

Hơn nữa, các chấm chuỗi như trong module1.module2.myFunct là vi phạm Law of Demeter. Có lẽ một ngày nào đó bạn sẽ muốn thay thế module1 bằng một số mô-đun khác module1a mà không nhập module2. Bằng cách sử dụng import module2, bạn sẽ tránh phải viết lại tất cả các lần xuất hiện của module1.module2.myFunct.

from module2 import * thường là hành vi không tốt vì khó có thể theo dõi các biến đến từ đâu. Và trộn các không gian tên mô-đun có thể tạo xung đột tên biến. Ví dụ, from numpy import * là một định không-không, vì làm như vậy sẽ ghi đè BUILTIN sum, min, max, any, all, absround của Python.

3

Trích dẫn các PEP 8 style guide:

Khi nhập một lớp từ một mô-đun lớp chứa, nó thường được đánh vần này:

from myclass import MyClass 
from foo.bar.yourclass import YourClass 

Nếu chính tả điều này gây ra vụ đụng độ tên địa phương, sau đó đánh vần chúng

import myclass 
import foo.bar.yourclass 

Mỏ nhấn mạnh.

Không sử dụng module1.module2; bạn đang dựa vào các chi tiết triển khai nội bộ của module1, mà sau này có thể thay đổi những gì nhập khẩu đang sử dụng. Bạn có thể nhập trực tiếp module2, do đó, trừ khi có ghi chú khác của tác giả mô-đun.

Bạn có thể sử dụng __all__ convention để giới hạn nội dung được nhập từ mô-đun với from modulename import *; các danh hiệu help() lệnh danh sách là tốt.Liệt kê các tên bạn một cách rõ ràng xuất khẩu trong __all__ giúp dọn dẹp trình bày help() văn bản:

Các tên công xác định bởi một mô-đun được xác định bằng cách kiểm tra không gian tên của mô-đun cho một biến có tên __all__; nếu được xác định, nó phải là một chuỗi các chuỗi được các tên được xác định hoặc được nhập bởi mô-đun đó. Các tên được đặt trong __all__ đều được coi là công khai và bắt buộc phải tồn tại. Nếu __all__ không được xác định, tập hợp các tên công khai bao gồm tất cả các tên được tìm thấy trong không gian tên của mô-đun không bắt đầu bằng ký tự gạch dưới ('_'). __all__ phải chứa toàn bộ API công khai. Nó được thiết kế để tránh vô tình xuất các mục không phải là một phần của API (chẳng hạn như các mô-đun thư viện được nhập và sử dụng trong mô-đun).

Các vấn đề liên quan