2010-05-25 39 views
7

Trong những điều Bắt gnome cơ sở mã tôi stumbled khi tuyên bố nhập khẩu nàynhững gì hiện "từ MODULE nhập khẩu _" làm trong python?

from GTG import _ 

và không có ý tưởng những gì nó có nghĩa là, không bao giờ thấy điều này trong tài liệu và một cách nhanh chóng như vậy/google tìm kiếm đã không bật bất cứ điều gì lên.

Trả lời

11

from GTG import _ nhập hàm _ từ mô-đun GTG vào không gian tên "hiện tại".

Thông thường, hàm _ là bí danh cho gettext.gettext(), một hàm hiển thị phiên bản được bản địa hóa của một thư nhất định. Tài liệu cung cấp hình ảnh về những gì thường xảy ra ở đâu đó trong một mô-đun ở xa, cách xa:

import gettext 
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory') 
gettext.textdomain('myapplication') 
_ = gettext.gettext 
# ... 
print _('This is a translatable string.') 
+0

Xin cảm ơn, điều này thực sự hữu ích. Tôi đã nhận thức được cú pháp chung 'từ BLA nhập khẩu bla' để tìm hiểu về quy ước này thực sự là những gì tôi đang tìm kiếm! Sử dụng một cách viết tắt như vậy có ý nghĩa hơn bây giờ. Cảm ơn bạn – Paul

+0

@bp Sử dụng hợp lý. Bên cạnh đó, đọc tài liệu được waaaaay có giá trị cao hơn trong văn hóa python hơn là khẳng định quyền sở hữu là ... – twneale

4

Điều này nhập hàm/lớp/mô-đun _ vào không gian tên hiện tại. Vì vậy, thay vì phải nhập GTG._, bạn chỉ cần nhập _ để sử dụng.

Dưới đây là một số tài liệu:

http://docs.python.org/tutorial/modules.html#more-on-modules

Cần lưu ý rằng bạn nên sử dụng này một cách cẩn thận. Làm điều này quá nhiều có thể gây ô nhiễm không gian tên hiện tại, làm cho mã khó đọc hơn và có thể giới thiệu các lỗi thời gian chạy. Ngoài ra, KHÔNG BAO GIỜ KHÔNG BAO GIỜ KHÔNG BAO GIỜ làm điều này:

from MODULE import * 

, vì nó rất nhiều gây ô nhiễm không gian tên hiện tại.

Kỹ thuật này hữu ích nhất khi bạn biết bạn chỉ sử dụng một hoặc hai hàm/lớp/mô-đun từ mô-đun, vì việc này chỉ nhập các nội dung được liệt kê.

Ví dụ, nếu tôi muốn sử dụng imap chức năng từ các module itertools, và tôi biết tôi sẽ không cần bất kỳ itertools chức năng khác, tôi có thể viết

from itertools import imap 

và nó sẽ chỉ nhập imap chức năng.

Như tôi đã nói trước đó, điều này nên được sử dụng một cách cẩn thận, vì một số người có thể nghĩ rằng

import itertools 

# ... more code ... 

new_list = itertools.imap(my_func, my_list) 

là dễ đọc hơn so

from itertools import imap 

# ... more code ... 

new_list = imap(my_func, my_list) 

vì nó làm cho nó rõ ràng chính xác mô-đun imap chức năng đến từ.

+8

Điều đáng nói là '_' không có ý nghĩa đặc biệt trong Python, nó chỉ là một chữ cái khác ký tự mà bạn có thể sử dụng để đặt tên biến. –

+0

@Paul, cảm ơn vì đã chỉ ra điều này. Tôi đã nhận thức được cú pháp chung 'từ cú pháp nhập khẩu GTG' nhưng _ nhầm lẫn tôi. Bây giờ, trước đây tôi đã nghĩ rằng sẽ có một tệp _.py trong thư mục gói GTG, nhưng tôi đoán đó là sai. tệp '__init__.py' trong thư mục GTG/có dòng '_ = dịch.gettext ' vì vậy tôi đoán đó là tất cả _ đó là sau đó. Bất kỳ lý do ai đó muốn đặt tên cho một chức năng theo cách kỳ lạ như vậy? – Paul

+0

@DavidZ Không hoàn toàn đúng. từ nhập khẩu fibo * nhập tất cả các tên trừ các tên bắt đầu bằng dấu gạch dưới (_). –

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