2013-02-21 25 views
26

Vì vậy, đây chỉ là một câu hỏi đơn giản. Trong python khi nhập khẩu các module, sự khác biệt giữa điều này là gì:Nhập mô-đun Python: Một dòng so với Đa dòng

from module import a, b, c, d 

và điều này

from module import a 
from module import b 
from module import c 
from module import d 

Đối với tôi nó có ý nghĩa lúc nào cũng có thể bám mã và sử dụng ví dụ đầu tiên, nhưng tôi đã được nhìn thấy một số mẫu mã ra có đồng thứ hai. Có bất kỳ sự khác biệt nào cả hoặc là tất cả trong sở thích của lập trình viên?

+1

Đầu tiên có thể là bao giờ nên hơi nhanh hơn, tùy thuộc vào thực hiện phiên dịch, tôi nghĩ, nhưng tôi không thể thực sự nghĩ về bất kỳ cách nào khác họ sẽ khác với quan điểm của người dùng ngôn ngữ. –

Trả lời

49

Không có sự khác biệt nào cả. Cả hai đều hoạt động giống nhau.

Tuy nhiên, từ góc độ phong cách, người ta có thể thích hợp hơn người kia. Và trên lưu ý rằng, các PEP-8 for imports nói rằng bạn nên nén from module import name1, name2 vào một dòng duy nhất và để lại import module1 trên nhiều dòng:

Yes: import os 
    import sys 

No: import sys, os 

Ok: from subprocess import Popen, PIPE 

Để đối phó với @ teewuane của bình luận (lặp đi lặp lại ở đây trong trường hợp nhận xét bị xóa):

@ inspectorG4dget Điều gì sẽ xảy ra nếu bạn phải nhập nhiều chức năng từ một mô-đun và kết thúc là làm cho dòng đó dài hơn 80 char? Tôi biết rằng điều 80 char là "khi nó làm cho mã dễ đọc hơn" nhưng tôi vẫn tự hỏi liệu có cách nào gọn gàng hơn để làm điều này không. Và tôi không muốn làm từ foo nhập * mặc dù tôi về cơ bản nhập mọi thứ.

Vấn đề ở đây là làm một cái gì đó như sau có thể vượt quá giới hạn 80 char:

from module import func1, func2, func3, func4, func5 

Về điều này, tôi có hai phản ứng (tôi không thấy PEP8 là quá rõ ràng về điều này) :

chia nó ra thành hai hàng nhập khẩu:

from module import func1, func2, func3 
from module import func4, func5 

Làm điều này có bất lợi là nếu module bị loại bỏ khỏi codebase hoặc được tái cấu trúc khác, thì cả hai dòng nhập sẽ cần phải bị xóa. Điều này có thể chứng minh được đau đớn

Chia dòng:

Để giảm thiểu những lo ngại trên, nó có thể là khôn ngoan để làm

from module import func1, func2, func3, \ 
    func4, func5 

này sẽ cho kết quả trong một lỗi nếu dòng thứ hai là không bị xóa cùng với cụm từ đầu tiên, trong khi vẫn duy trì câu lệnh nhập số ít

+0

Tôi nghĩ đây là trường hợp. Tất cả trong con mắt của lập trình viên. Tôi không bao giờ biết về các vấn đề mô-đun dòng đơn mặc dù, tôi sử dụng ở khắp mọi nơi, sẽ cần phải thực hiện một số thay đổi. Cảm ơn! –

+4

@CodyBrown: 'các vấn đề dòng đơn' <- chúng không thực sự là vấn đề; giống như hướng dẫn về phong cách. Hoàn toàn không có nhiệm vụ để theo họ. Bạn có thể đang làm việc trên một nhóm sử dụng một hướng dẫn phong cách hoàn toàn khác, trong trường hợp này PEP-8 trở nên hoàn toàn không thể áp dụng được – inspectorG4dget

+1

@ inspectorG4dget Điều gì sẽ xảy ra nếu bạn phải nhập một số chức năng từ một mô-đun và kết thúc. Tôi biết rằng điều 80 char là "khi nó làm cho mã dễ đọc hơn" nhưng tôi vẫn tự hỏi nếu có một cách gọn gàng hơn để làm điều này. Và tôi không muốn làm 'từ foo import * 'mặc dù tôi về cơ bản đang nhập mọi thứ. – teewuane

15

Để thêm một số câu hỏi được nêu từ inspectorG4dget's answer, bạn cũng có thể sử dụng bộ dữ liệu để thực hiện nhiều dòng nhập khẩu khi cấu trúc thư mục bắt đầu được lồng sâu hoặc bạn có các mô-đun với tên ngụy tạo.

from some.module.submodule.that_has_long_names import (
    first_item, 
    second_item, 
    more_imported_items_with_really_enormously_long_names_that_might_be_too_descriptive, 
    that_would_certainly_not_fit, 
    on_one_line, 
) 

này cũng làm việc, mặc dù tôi không phải là một fan hâm mộ của phong cách này:

from module import (a_ton, of, modules, that_seem, to_keep, needing, 
        to_be, added, to_the_list, of_required_items) 
+0

Cá nhân, tôi thấy đây là phong cách yêu thích cá nhân của tôi. Nó không yêu cầu ngắt dòng hoặc dự phòng – codeblooded