2009-02-15 29 views
7

Trong C++, bạn có thể thường xuyên cải thiện đáng kể khả năng đọc mã của bạn bằng cách sử dụng cẩn thận của các "sử dụng" từ khóa, ví dụ:Liệu python có một cái gì đó giống như C++ 's bằng cách sử dụng từ khóa?

void foo() 
{ 
    std::vector< std::map <int, std::string> > crazyVector; 
    std::cout << crazyVector[0].begin()->first; 
} 

trở thành

void foo() 
{ 
    using namespace std; // limited in scope to foo 
    vector< map <int, string> > crazyVector; 
    cout << crazyVector[0].begin()->first; 
} 

Liệu điều gì đó tồn tại tương tự cho trăn, hoặc tôi có phải hội đủ điều kiện không?

Tôi sẽ thêm tuyên bố từ chối trách nhiệm mà tôi biết rằng việc sử dụng có những cạm bẫy của nó và nó phải được giới hạn một cách thích hợp trong phạm vi.

Trả lời

19

Như Bill nói, Python không có việc xây dựng

from X import * 

nhưng bạn cũng có thể một cách rõ ràng xác định những tên mà bạn muốn nhập khẩu từ các mô-đun (namespace):

from X import foo, bar, blah 

này có xu hướng làm cho đoạn code thậm chí dễ đọc hơn/dễ hiểu, vì một người nào đó nhìn thấy một định danh trong nguồn không n eed để tìm kiếm tất cả các mô-đun đã nhập để xem nó đến từ đâu. Dưới đây là một câu hỏi liên quan: Namespace Specification In Absence of Ambuguity

EDIT: để đáp lại lời nhận xét Pax, tôi sẽ đề cập rằng bạn cũng có thể viết những thứ như

import X.foo 

nhưng sau đó bạn sẽ cần phải viết

X.foo.moo() 

thay vì chỉ

foo.moo() 

Điều này không nhất thiết phải là một điều xấu, tất nhiên. Tôi thường sử dụng hỗn hợp các hình thức from X import yimport X.y, bất kỳ điều gì tôi cảm thấy làm cho mã của tôi rõ ràng nhất. Đó chắc chắn là một điều chủ quan ở một mức độ nào đó.

+0

Bạn có thể muốn mở rộng mục này để bao gồm "nhập X", sau đó cho phép bạn sử dụng các thứ X. từ mô-đun đó. Đôi khi tôi thích điều này để giảm ô nhiễm không gian tên. – paxdiablo

+0

Cuộc gọi tốt, được thực hiện ;-) –

+1

Tại sao "không giống như C++"? Bạn không thể sử dụng "using std :: string;"? – Constantin

6
import X 

hoặc

from X import * 

hoặc

from X import a, b, c 

đâu X là mô-đun Python bạn muốn sử dụng.

Sẽ rất hữu ích nếu bạn cung cấp cho chúng tôi mẫu mã Python mà bạn cho rằng cần phải dọn dẹp.

5

Chắc chắn, tính năng động của python làm cho điều này trở nên tầm thường. Nếu bạn đã có một lớp chôn sâu trong một không gian tên: foo.bar.baz.blah, bạn có thể làm:

def foo: 
    f = foo.bar.baz.blah 
    f1 = f() 
0

Lưu ý rằng

from foo import bar 

làm việc ngay cả khi bar là một module trong gói foo.Điều này cho phép bạn hạn chế ô nhiễm không gian tên của bạn mà không cần phải đặt tên cho mỗi chức năng/lớp học trong foo.bar mà bạn có thể quan tâm để sử dụng. Nó cũng hỗ trợ người đọc mã của bạn, bởi vì họ sẽ thấy một cuộc gọi đến bar.baz() và có ý tưởng tốt hơn về nơi mà baz xuất phát từ đó.

1

Ngoài câu trả lời của David:

  1. Người ta phải sử dụng dấu ngoặc tròn trong from X import (foo, bar, blah) cho một lợi ích của PEP8.
  2. Cú pháp đầy đủ cho phép đổi tên tên gói (rebinding) thành số nhận dạng mới trong phạm vi của mô-đun hiện tại như trong from foo import bar as baz.

Tôi khuyên bạn nên tìm kiếm các hướng dẫn cho import keyword, các __import__ built-in và giải thích cho sys.modules như tiếp tục đọc.

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