Những điều về chức năng được xây dựng trong và các loại và các nhà khai thác và vân vân là chúng không thực hiện bằng Python. Thay vào đó, chúng được thực hiện trong C, đó là một ngôn ngữ lập trình đau đớn và chi tiết hơn và sẽ không luôn luôn dịch tốt sang Python (thường là vì mọi thứ dễ dàng hơn trong Python một cách dễ dàng hơn.)
Với điều đó, bạn có thể điều tra tất cả việc triển khai trực tuyến của Python, thông qua public source repository của họ.
Việc triển khai cho in
được phân tán - có một triển khai cho mỗi loại, cộng với triển khai tổng quát hơn gọi triển khai loại cụ thể (nhiều hơn về sau). Ví dụ: đối với danh sách, chúng tôi sẽ tìm kiếm việc triển khai danh sách. Trong cây nguồn Python, nguồn cho tất cả các đối tượng dựng sẵn nằm trong thư mục Objects. Trong thư mục đó, bạn sẽ tìm thấy listobject.c, trong đó có chứa thực hiện cho đối tượng danh sách và tất cả các phương thức của nó.
Trên kho lưu trữ tại thời điểm trả lời, nếu bạn nhìn vào line 393 bạn sẽ thấy việc triển khai toán tử trong (còn được gọi là phương thức __contains__
, giải thích tên hàm). Nó khá đơn giản, chỉ lặp qua tất cả các phần tử của danh sách cho đến khi tìm thấy phần tử hoặc không có phần tử nào khác và trả về kết quả tìm kiếm. :)
Nếu nó giúp, bằng Python cách ngữ viết này sẽ là:
def __contains__(self, obj):
for item in self:
if item == obj:
return True
return False
tôi đã nói trước rằng có một thực hiện tổng quát hơn.Điều đó có thể được nhìn thấy trong việc triển khai PySequence_Contains
trong abstract.c
. Nó cố gắng gọi phiên bản kiểu cụ thể, và nếu điều đó không thành công, hãy đặt chỗ cho việc lặp lại thông thường. Vòng lặp đó có những gì một Python thường xuyên cho vòng lặp trông giống như khi bạn viết nó trong C (bằng cách sử dụng Python C-API).
Nguồn
2012-04-21 16:34:27
'in' là một ví dụ không may - nó không phải là một hàm duy nhất (trừ khi bạn đếm bộ thông dịch bytecode bên dưới, nhưng mọi thứ lộn xộn ở đó và có ít nhưng chính sách cấp thấp), đó là một phương thức của toán hạng bên phải. Để làm cho mọi thứ trở nên tồi tệ hơn, có một trường hợp đặc biệt mà * không * có một cài đặt mặc định, được chôn ở đâu đó ở độ sâu của trình thông dịch bytecode. – delnan
@ delnan thực sự nó không quá tệ, tôi đã tìm kiếm nó khi tôi mở rộng câu trả lời của tôi, và nó chỉ chống lại một hàm trong abstract.c, vì vậy bạn không thực sự phải nhìn vào trình thông dịch bytecode để xem việc thực hiện của. –
@ DevinJeanpierre Cảm ơn, tôi không quá quen thuộc với những người bên trong như vậy - tôi chỉ biết 'in' có hướng dẫn bytecode riêng của mình, nên đã đoán họ sử dụng lại mã để thực hiện C-API. – delnan