2010-06-19 28 views
5

Trong Mercurial, nhiều người trong các phần mở rộng quấn chuỗi help/cú pháp của họ trong một cuộc gọi đến một chức năng gạch dưới, như vậy:Mercurial/Python - Chức năng Underscore làm gì?

_('[OPTION] [QUEUE]') 

này confuses me, bởi vì nó dường như không cần thiết (các Writing Extensions hướng dẫn không đề cập đến nó) và dường như không có một _ định nghĩa trong lớp, vì vậy tôi tự hỏi nếu đây là một cú pháp đặc biệt mà tôi không hiểu, có lẽ một cách khác để nói lambda, hoặc có thể là chức năng nhận diện? Ngoài ra tôi tự hỏi những gì lợi ích của phương pháp này (bất cứ điều gì nó là) là hơn chỉ là chuỗi thô như tài liệu cho thấy.

Không có gì tôi thấy trong tài liệu Python đề cập đến một hàm như vậy, vì vậy tôi không chắc đây có phải là câu hỏi Python hay câu hỏi Mercurial.

Dưới đây là hai ví dụ mà sử dụng cấu trúc này (nhìn vào cmdtable điển gần cuối của tập tin)

Trả lời

8

Look on line 45:

from mercurial.i18n import _ 

Đây là abb thông thường reviation trong gói quốc tế hóa gettext, và có thể cả các gói khác nữa, cho hàm trả về một bản dịch đối số của nó sang ngôn ngữ chương trình hiện đang chạy. Nó được viết tắt là _ để thuận tiện, vì nó được sử dụng cho mọi thông báo được hiển thị người dùng.

Có vẻ như Mercurial kết thúc tốt đẹp trong mô-đun của riêng họ. ("i18n" là viết tắt của "quốc tế hóa" vì có 18 chữ cái ở giữa "i" và "n".)

+0

Ahaha! Ok cảm ơn bạn! Vì vậy, đây là để thuận tiện nếu ai đó muốn chạy nó bằng ngôn ngữ riêng của họ - nhưng họ vẫn phải cung cấp/cam kết bản dịch của riêng họ, phải không? Nếu tôi sử dụng gettext tôi không dự kiến ​​sẽ cung cấp của riêng tôi, phải không? – dimo414

+0

@ dimo414, với 'gettext' của thư viện chuẩn (và với ngôn ngữ riêng của GNU), bạn đã _definitely_ dự kiến ​​sẽ cung cấp bản dịch của riêng bạn - mã của' gettext' là lấy và sử dụng các cụm từ đã dịch, nó chắc chắn nhất ** không ** làm dịch máy tự động giữa các ngôn ngữ tự nhiên khác nhau !!! –

+0

@ Alex, xin lỗi tôi không rõ ràng - câu hỏi là về kỳ vọng chứ không phải chức năng. Từ quan điểm "cung cấp chương trình hoàn thành", tôi có dự kiến ​​tự tạo bản dịch này hay không, hoặc tôi có thể phát hành mã mà không có chúng không? – dimo414

6

_ (tên hàm của một dấu gạch dưới) thường được liên kết với quốc tế hóa, do tiền lệ của gettext, một cách tiếp cận GNU đó cũng đã tìm thấy một chỗ trong thư viện chuẩn của Python (cùng kiến ​​trúc, thực hiện hoàn toàn khác nhau) - mỗi the module's docs,

gettext.install(domain[, localedir[, unicode[, codeset[, names]]]]) 

này cài đặt chức năng _() trong namespace builtins Python, dựa trên miền, localedi r, và mã số mà được chuyển đến hàm dịch(). Cờ unicode là được chuyển đến phương thức install() của phương thức của đối tượng.

Để biết thông số tên, vui lòng xem mô tả bản dịch phương thức install() của đối tượng.

Như đã thấy dưới đây, bạn thường đánh dấu chuỗi trong ứng dụng của bạn mà là ứng cử viên cho dịch thuật, bởi gói chúng trong một cuộc gọi đến các chức năng _() , như thế này:

print _('This string will be translated.') 

Để thuận tiện, bạn muốn chức năng _() được cài đặt trong không gian tên nội trang của Python, do đó, nó có thể dễ dàng có thể truy cập được trong tất cả các mô-đun của đơn đăng ký của bạn.

Như @ptomato đề cập, Mercurial đã theo dõi truyền thống này bằng cách đặt tên cho các mục đích quốc tế tương tự.

Ngoài ra còn có một truyền thống riêng biệt để sử dụng _ như chữ "I do not care" nhận dạng, như trong

fee, fie, _, _, foo, _, fum = thesevenitemstuple 

nhưng tất nhiên bạn muốn tốt hơn không được sử dụng cả hai truyền thống cùng một lúc trong cùng một code ;-)

+1

Bạn có nghĩa là "thư viện chuẩn của Python", phải không? – tonfa

+0

@tonfa, vâng - sửa chữa, cảm ơn. –

+0

+1 để giải thích hoạt động bên trong của .install() – BlackVegetable

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