2012-07-07 10 views
7

Tôi đã đọc mã nguồn của collections.py hôm qua.Lý do đổi tên thuộc tính thành _property

Trong chức năng namedtuple, một chuỗi template được tạo và sau đó exec được chỉnh sửa trong một không gian tên tạm thời.

Trong dict không gian tên, property được đổi tên thành _propertytuple thành _tuple.

Tôi tự hỏi lý do đằng sau điều này là gì. Việc đổi tên này có vấn đề gì sẽ giúp tránh?

Trả lời

9

Nói chung, các tên gạch dưới đôi khi được sử dụng trong thư viện chuẩn để giữ cho không gian tên được sạch sẽ.

Trong trường hợp của _tuple, nó là cần thiết vì bạn được phép sử dụng "tuple" như một tên trường:

>>> Example = namedtuple('Example', ['list', 'tuple', 'property']) 
>>> e.list 
[10, 20, 30] 
>>> e.tuple 
(40, 50, 60) 
>>> e.property 
'Boardwalk' 
+2

@JBernardo, bạn biết RH là một trong những nhà phát triển lõi Python phải không? Ý tôi là yeah, anh ấy đã sai về điều này, nhưng tôi nghi ngờ anh ấy đang nói từ kinh nghiệm. – senderle

+4

Đó là sự thật, tôi là tác giả của mã cho * namedtuple * :-) –

+0

Vì vậy, tôi không xa nói rằng tôi muốn "với", "như" và "ngoại trừ" như tên trường sau đó? :) –

0

Nó tránh xung đột tên từ khóa.

Giả sử chúng tôi có danh sách tưởng tượng là ['when', 'who', 'why', 'where', 'with']

tức là. người ta không thể gõ my_name_tuple.with mà không có thông dịch viên đi ouch.

Đọc tài liệu trên tên tệp kỹ lưỡng và bạn sẽ nhận được nó.

+0

Trong Python2.7 bạn có thể đặt 'rename = True' rằng các tên không hợp lệ như 'with' sẽ được thay thế bằng một cái gì đó như' _4'. Đi ouch hay không, điều này sẽ không ảnh hưởng đến tuyên bố như 'x = property (...)' được thực hiện trong bối cảnh định nghĩa lớp. – satoru