Lớp bên trong tham chiếu python
Hướng dẫn này cung cấp phần giới thiệu cơ bản của lập trình viên Python về cách làm việc với bộ đệm giao thức. Bằng cách đi qua việc tạo một ứng dụng ví dụ đơn giản, nó chỉ cho bạn cách Show
Đây không phải là hướng dẫn toàn diện về cách sử dụng bộ đệm giao thức trong Python. Để biết thông tin tham khảo chi tiết hơn, hãy xem Hướng dẫn ngôn ngữ bộ đệm giao thức (proto2), Hướng dẫn ngôn ngữ bộ đệm giao thức (proto3), Tham chiếu API Python, Hướng dẫn mã được tạo bằng Python và Tham chiếu mã hóa Miền vấn đềVí dụ chúng ta sẽ sử dụng là một ứng dụng "sổ địa chỉ" rất đơn giản có thể đọc và ghi chi tiết liên hệ của mọi người vào và từ một tệp. Mỗi người trong sổ địa chỉ đều có tên, ID, địa chỉ email và số điện thoại liên hệ Làm cách nào để bạn tuần tự hóa và truy xuất dữ liệu có cấu trúc như thế này?
Thay vì các tùy chọn này, bạn có thể sử dụng bộ đệm giao thức. Bộ đệm giao thức là giải pháp linh hoạt, hiệu quả, tự động để giải quyết chính xác vấn đề này. Với bộ đệm giao thức, bạn viết một mô tả protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 về cấu trúc dữ liệu mà bạn muốn lưu trữ. Từ đó, trình biên dịch bộ đệm giao thức tạo ra một lớp thực hiện mã hóa và phân tích cú pháp tự động dữ liệu bộ đệm giao thức với định dạng nhị phân hiệu quả. Lớp được tạo cung cấp getters và setters cho các trường tạo nên bộ đệm giao thức và đảm nhiệm các chi tiết về đọc và ghi bộ đệm giao thức dưới dạng một đơn vị. Điều quan trọng là định dạng bộ đệm giao thức hỗ trợ ý tưởng mở rộng định dạng theo thời gian sao cho mã vẫn có thể đọc dữ liệu được mã hóa bằng định dạng cũ Nơi tìm mã ví dụMã ví dụ được bao gồm trong gói mã nguồn, trong thư mục "ví dụ". Tải về tại đây Xác định định dạng giao thức của bạnĐể tạo ứng dụng sổ địa chỉ, bạn cần bắt đầu với tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2. Các định nghĩa trong tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 rất đơn giản. bạn thêm một thông báo cho từng cấu trúc dữ liệu mà bạn muốn sắp xếp theo thứ tự, sau đó chỉ định tên và loại cho từng trường trong thông báo. Đây là tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 xác định thông điệp của bạn, protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; } Như bạn có thể thấy, cú pháp tương tự như C++ hoặc Java. Hãy xem qua từng phần của tệp và xem nó làm gì Tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 bắt đầu bằng một khai báo gói, giúp tránh xung đột đặt tên giữa các dự án khác nhau. Trong Python, các gói thường được xác định theo cấu trúc thư mục, do đó, protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto4 bạn xác định trong tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 của mình sẽ không ảnh hưởng đến mã được tạo. Tuy nhiên, bạn vẫn nên khai báo một tên để tránh xung đột tên trong không gian tên Bộ đệm giao thức cũng như trong các ngôn ngữ không phải Python Có thể bạn quan tâmTiếp theo, bạn có định nghĩa tin nhắn của mình. Một tin nhắn chỉ là một tổng hợp chứa một tập hợp các trường đã nhập. Nhiều kiểu dữ liệu đơn giản tiêu chuẩn có sẵn dưới dạng các kiểu trường, bao gồm protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto6, protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto7, protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto8, protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto9 và class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK0. Bạn cũng có thể thêm cấu trúc khác cho thông báo của mình bằng cách sử dụng các loại thông báo khác làm loại trường – trong ví dụ trên, thông báo class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK1 chứa thông báo class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK2, trong khi thông báo class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK3 chứa thông báo class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK1. Bạn thậm chí có thể xác định các loại thư được lồng trong các thư khác – như bạn có thể thấy, loại class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK2 được xác định bên trong class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK1. Bạn cũng có thể xác định các loại class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK7 nếu bạn muốn một trong các trường của mình có một trong các danh sách giá trị được xác định trước – ở đây bạn muốn chỉ định rằng một số điện thoại có thể là một trong các loại điện thoại sau. class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK8, class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK9 hoặc syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; }70 Các dấu "= 1", "= 2" trên mỗi phần tử xác định "thẻ" duy nhất mà trường đó sử dụng trong mã hóa nhị phân. Số thẻ 1-15 yêu cầu ít byte hơn để mã hóa so với số cao hơn, do đó, để tối ưu hóa, bạn có thể quyết định sử dụng các thẻ đó cho các phần tử thường được sử dụng hoặc lặp lại, để lại các thẻ 16 trở lên cho các phần tử tùy chọn ít được sử dụng hơn. Mỗi phần tử trong một trường lặp lại yêu cầu mã hóa lại số thẻ, vì vậy các trường lặp lại là những ứng cử viên đặc biệt tốt cho việc tối ưu hóa này Mỗi trường phải được chú thích bằng một trong các công cụ sửa đổi sau
Bắt buộc là Mãi mãi Bạn nên rất cẩn thận khi đánh dấu các trường là syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; }74. Nếu tại một thời điểm nào đó bạn muốn dừng viết hoặc gửi trường bắt buộc, sẽ có vấn đề khi thay đổi trường này thành trường tùy chọn – người đọc cũ sẽ coi thư không có trường này là không đầy đủ và có thể vô tình từ chối hoặc loại bỏ chúng. Thay vào đó, bạn nên xem xét việc viết các quy trình xác thực tùy chỉnh dành riêng cho ứng dụng cho bộ đệm của mình. Trong Google, các trường syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; }74 không được ưa chuộng lắm; . (Proto3 hoàn toàn không hỗ trợ các trường syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; }74. ) Bạn sẽ tìm thấy hướng dẫn đầy đủ để viết tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 – bao gồm tất cả các loại trường có thể có – trong Hướng dẫn ngôn ngữ bộ đệm giao thức. Tuy nhiên, đừng tìm kiếm các cơ sở tương tự như kế thừa lớp – bộ đệm giao thức không làm điều đó Biên dịch bộ đệm giao thức của bạnBây giờ bạn đã có một protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2, điều tiếp theo bạn cần làm là tạo các lớp mà bạn sẽ cần để đọc và viết các thông báo class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK3 (và do đó là class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK1 và class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK2). Để thực hiện việc này, bạn cần chạy trình biên dịch bộ đệm giao thức protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto05 trên protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 của mình
Điều này tạo ra protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto40 trong thư mục đích được chỉ định của bạn API bộ đệm giao thứcKhông giống như khi bạn tạo mã bộ đệm giao thức Java và C++, trình biên dịch bộ đệm giao thức Python không trực tiếp tạo mã truy cập dữ liệu cho bạn. Thay vào đó (như bạn sẽ thấy nếu bạn nhìn vào protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto40), nó tạo ra các bộ mô tả đặc biệt cho tất cả thư, bảng liệt kê và trường của bạn và một số lớp trống bí ẩn, mỗi lớp cho mỗi loại thư class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK Dòng quan trọng trong mỗi lớp là protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto42. Mặc dù các chi tiết về cách thức hoạt động của các siêu dữ liệu Python nằm ngoài phạm vi của hướng dẫn này, nhưng bạn có thể coi chúng giống như một khuôn mẫu để tạo các lớp. Tại thời điểm tải, siêu dữ liệu protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto43 sử dụng các bộ mô tả đã chỉ định để tạo tất cả các phương thức Python mà bạn cần để làm việc với từng loại thông báo và thêm chúng vào các lớp có liên quan. Sau đó, bạn có thể sử dụng các lớp được điền đầy đủ trong mã của mình Kết quả cuối cùng của tất cả những điều này là bạn có thể sử dụng lớp class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK1 như thể nó định nghĩa từng trường của lớp cơ sở protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto45 như một trường thông thường. Ví dụ, bạn có thể viết syntax = "proto2"; package tutorial; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { optional string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; }7 Lưu ý rằng các nhiệm vụ này không chỉ thêm các trường mới tùy ý vào một đối tượng Python chung. Nếu bạn cố gắng chỉ định một trường không được xác định trong tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2, một protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto47 sẽ xuất hiện. Nếu bạn gán một trường cho một giá trị không đúng loại, thì sẽ xuất hiện lỗi protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto48. Ngoài ra, việc đọc giá trị của một trường trước khi nó được đặt sẽ trả về giá trị mặc định protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto0 Để biết thêm thông tin về chính xác những thành viên mà trình biên dịch giao thức tạo ra cho bất kỳ định nghĩa trường cụ thể nào, hãy xem tham chiếu mã do Python tạo ra liệt kêEnums được siêu dữ liệu mở rộng thành một tập hợp các hằng số tượng trưng với các giá trị nguyên. Vì vậy, ví dụ, hằng số protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto49 có giá trị 2 Phương thức nhắn tin tiêu chuẩnMỗi lớp thông báo cũng chứa một số phương thức khác cho phép bạn kiểm tra hoặc thao tác với toàn bộ thông báo, bao gồm
Các phương thức này triển khai giao diện protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto45. Để biết thêm thông tin, hãy xem tài liệu API hoàn chỉnh cho protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto45 Phân tích cú pháp và tuần tự hóaCuối cùng, mỗi lớp bộ đệm giao thức có các phương thức để viết và đọc thông báo thuộc loại bạn đã chọn bằng cách sử dụng định dạng nhị phân của bộ đệm giao thức. Bao gồm các
Đây chỉ là một vài tùy chọn được cung cấp để phân tích cú pháp và tuần tự hóa. Một lần nữa, hãy xem tài liệu tham khảo API protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto45 để biết danh sách đầy đủ Bộ đệm giao thức và thiết kế hướng đối tượng Các lớp bộ đệm giao thức về cơ bản là các bộ chứa dữ liệu (như các cấu trúc trong C) không cung cấp chức năng bổ sung; . Nếu bạn muốn thêm hành vi phong phú hơn vào một lớp đã tạo, cách tốt nhất để làm điều này là bọc lớp bộ đệm giao thức đã tạo trong một lớp dành riêng cho ứng dụng. Gói bộ đệm giao thức cũng là một ý tưởng hay nếu bạn không có quyền kiểm soát thiết kế của tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 (ví dụ: nếu bạn đang sử dụng lại một bộ đệm từ một dự án khác). Trong trường hợp đó, bạn có thể sử dụng lớp trình bao bọc để tạo giao diện phù hợp hơn với môi trường duy nhất của ứng dụng của bạn. ẩn một số dữ liệu và phương thức, hiển thị các chức năng tiện lợi, v.v. Bạn không bao giờ nên thêm hành vi vào các lớp được tạo bằng cách kế thừa từ chúng. Điều này sẽ phá vỡ các cơ chế bên trong và dù sao cũng không phải là cách thực hành hướng đối tượng tốt Viết một tin nhắnBây giờ, hãy thử sử dụng các lớp đệm giao thức của bạn. Điều đầu tiên bạn muốn ứng dụng sổ địa chỉ của mình có thể thực hiện là ghi thông tin cá nhân vào tệp sổ địa chỉ của bạn. Để thực hiện việc này, bạn cần tạo và điền các phiên bản của các lớp bộ đệm giao thức của mình, sau đó ghi chúng vào luồng đầu ra Đây là một chương trình đọc một class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK3 từ một tệp, thêm một class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK1 mới vào nó dựa trên đầu vào của người dùng và ghi lại class Person(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType class PhoneNumber(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PERSON_PHONENUMBER DESCRIPTOR = _PERSON class AddressBook(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESSBOOK3 mới vào tệp một lần nữa. Các phần gọi trực tiếp hoặc mã tham chiếu do trình biên dịch giao thức tạo ra được tô sáng protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto4 đọc tin nhắnTất nhiên, một cuốn sổ địa chỉ sẽ không được sử dụng nhiều nếu bạn không thể lấy bất kỳ thông tin nào từ nó. Ví dụ này đọc tệp được tạo bởi ví dụ trên và in tất cả thông tin trong đó protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto6 Mở rộng bộ đệm giao thứcSớm hay muộn sau khi bạn phát hành mã sử dụng bộ đệm giao thức của mình, chắc chắn bạn sẽ muốn "cải thiện" định nghĩa của bộ đệm giao thức. Nếu bạn muốn bộ đệm mới của mình tương thích ngược và bộ đệm cũ của bạn tương thích về phía trước – và bạn gần như chắc chắn muốn điều này – thì có một số quy tắc bạn cần tuân theo. Trong phiên bản mới của bộ đệm giao thức
(Có một số ngoại lệ đối với các quy tắc này, nhưng chúng hiếm khi được sử dụng. ) Nếu bạn tuân theo các quy tắc này, mã cũ sẽ vui vẻ đọc thư mới và chỉ cần bỏ qua mọi trường mới. Đối với mã cũ, các trường tùy chọn đã bị xóa sẽ chỉ có giá trị mặc định và các trường lặp lại đã xóa sẽ trống. Mã mới cũng sẽ đọc rõ ràng các tin nhắn cũ. Tuy nhiên, hãy nhớ rằng các trường tùy chọn mới sẽ không xuất hiện trong thư cũ, vì vậy, bạn cần kiểm tra rõ ràng xem chúng có được đặt bằng protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto26 hay không hoặc cung cấp một giá trị mặc định hợp lý trong tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2 của bạn với protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto28 sau số thẻ. Nếu giá trị mặc định không được chỉ định cho phần tử tùy chọn, giá trị mặc định dành riêng cho loại sẽ được sử dụng thay thế. đối với chuỗi, giá trị mặc định là chuỗi rỗng. Đối với booleans, giá trị mặc định là sai. Đối với các loại số, giá trị mặc định là 0. Cũng lưu ý rằng nếu bạn đã thêm một trường mới được lặp lại, mã mới của bạn sẽ không thể biết liệu nó có bị bỏ trống (theo mã mới) hay không bao giờ được đặt (theo mã cũ) vì không có cờ protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto26 cho trường đó Sử dụng nâng caoBộ đệm giao thức có những công dụng vượt xa các trình truy cập và tuần tự hóa đơn giản. Hãy chắc chắn khám phá tài liệu tham khảo API Python để xem bạn có thể làm gì khác với chúng Một tính năng chính được cung cấp bởi các lớp bản tin giao thức là phản ánh. Bạn có thể lặp lại các trường của một thông báo và thao tác các giá trị của chúng mà không cần viết mã của bạn đối với bất kỳ loại thông báo cụ thể nào. Một cách rất hữu ích để sử dụng sự phản chiếu là chuyển đổi các thông báo giao thức sang và từ các mã hóa khác, chẳng hạn như XML hoặc JSON. Việc sử dụng phản xạ nâng cao hơn có thể là để tìm sự khác biệt giữa hai thông báo cùng loại hoặc để phát triển một loại "biểu thức chính quy cho thông báo giao thức" trong đó bạn có thể viết các biểu thức khớp với nội dung thông báo nhất định. Nếu bạn sử dụng trí tưởng tượng của mình, bạn có thể áp dụng Bộ đệm giao thức cho nhiều vấn đề hơn bạn có thể mong đợi ban đầu |
Bài Viết Liên Quan
Hướng dẫn mysql connectors - kết nối mysql
Để kết nối Java với MySQL bằng JDBC, giả sử bạn đã tạo bảng trong MySQL, bạn cần làm theo 4 bước sau: kết nối Java với MySQL bằng JDBC, giả sử bạn đã ...
Hướng dẫn css selector special characters - các ký tự đặc biệt của bộ chọn css
Câu trả lời ngắn gọn: DOM phân tích bất kỳ bộ chọn nào bạn chuyển cho nó dưới dạng chuỗi. Nếu kết quả (phân tích cú pháp bởi DOM) chứa khoảng trắng ...
Hướng dẫn python getter dict - python getter dict
Dẫn nhậpỞ các bài trước, bạn đọc đã tìm hiểu về CÁC PHƯƠNG THỨC ĐẶC BIỆT TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG PYTHON.Còn ở bài này, bạn đọc sẽ ...
Hướng dẫn print squares in python - in hình vuông bằng python
Nội phân Chính showShowQuảng trường Python: Sử dụng nhân hai lầnVuông một số sử dụng toán tử số mũ.Sử dụng phương thức math.pow () để tính toán bình ...
Hướng dẫn how do i write a javascript array to add positive and negative numbers? - làm cách nào để viết một mảng javascript để thêm các số dương và âm?
Vấn đềChúng tôi được yêu cầu viết một hàm JavaScript có trong một loạt các số (dương và âm). Hàm của chúng tôi nên tính toán và trả về tổng của tất ...
Hướng dẫn python-docx table margin - lề bảng python-docx
Tôi cần nhanh chóng thay đổi lề của nhiều tài liệu DOCX. Tôi đã kiểm tra Python-docx và tôi không tìm thấy cách truy cập/sửa đổi bố cục trang (đặc biệt là ...
Gala tết việt 2023
Mua vé Tết Vạn Lộc 2023 – Gala Gặp Nhau Cuối Năm. Gọi mua vé: 0962 986 358 / 0942 755 358 – (Xem SƠ ĐỒ VÉ bên dưới bài viết)1, Thông tin chi tiết Tết Vạn ...
Hướng dẫn how do i delete one character from the right in excel? - làm cách nào để xóa một ký tự từ bên phải trong excel?
Hôm qua, một trong những đồng nghiệp của tôi ...... Ai thực sự đam mê học Excel những ngày này ...... hỏi tôi điều này:Bạn có biết làm thế nào để loại ...
Hướng dẫn how to run php in xampp - cách chạy php trong xampp
Cập nhật lần cuối vào ngày 26.2022 213,8k lượt xem 213.8K Views Một công nghệ thích viết về các công nghệ khác nhau và truyền bá kiến thức. Một công ...
Hướng dẫn paired bootstrap python - đã ghép nối bootstrap python
Hướng dẫn sql vs python vs java - sql vs python vs javaTrang chủ & nbsp;> & nbsp; Khoa học dữ liệu & NBSP;> & NBSP;Khi chúng ta nói về các ngôn ngữ lập trình hàng đầu ...
Hướng dẫn sql vs python vs java - sql vs python vs java
Trang chủ & nbsp;> & nbsp; Khoa học dữ liệu & NBSP;> & NBSP;Khi chúng ta nói về các ngôn ngữ lập trình hàng đầu thế giới, & nbsp; chúng là một số ngôn ngữ lập ...
Hướng dẫn get dropdown selected text in php - tải xuống văn bản đã chọn trong php
Tôi hoàn toàn mới trong PHP, trên thực tế, lý do tôi làm điều này là để tùy chỉnh một plugin WordPress để nó có thể phù hợp với nhu cầu của tôi. Cho đến ...
Nghỉ hưu sớm trước năm 2023
Bà Ngọc An hỏi: Tôi là viên chức nữ theo diện tinh giản biên chế, sinh tháng 12.1968. Nếu nghỉ hưu trước tuổi năm 2023, tôi có bị trừ phần trăm lương hưu ...
Hướng dẫn node js server html page - trang html của máy chủ js
Máy chủ Node.js đơn giản nhất chỉ là:$ npm install http-server -g Bây giờ bạn có thể chạy một máy chủ thông qua các lệnh sau:$ cd MyApp $ http-server Nếu bạn đang ...
Hướng dẫn can i run python in a browser? - tôi có thể chạy python trong trình duyệt không?
Nếu bạn là một nhà phát triển web thích viết Python qua JavaScript, thì Brython, một triển khai Python chạy trong trình duyệt, có thể là một lựa chọn hấp ...
Hướng dẫn how do i import biopython into python? - làm cách nào để nhập biopython vào python?
OB Tiêu đề: Bắt đầu permalink: wiki/get_started bố cục: Wiki -Tải xuống và cài đặtĐối với Windows, chúng tôi cung cấp trình cài đặt nhấp chuột. Hầu hết ...
Hướng dẫn correlation heatmap python matplotlib - tương quan bản đồ nhiệt bản đồ python matplotlib
Nếu bạn đang đọc blog này, tôi chắc chắn bạn đã thấy các bản đồ nhiệt. Họ rất đẹp, nhưng họ tiết lộ chỉ nhiều như họ che giấu. Khi được thực ...
Hướng dẫn better than c++ - tốt hơn c ++
So sánh trong Tiếng Anh (1)Phần A: So sánh của tính từ và trạng từ1. So sánh bằngCông thức của so sánh bằng:S + V + as + adj/adv + as + N/pronounS + V + not + so/as + ...
Massage tại nhà tphcm 2023
Mua ghế massage Thủ Đức ở đâu uy tín, chất lượng là băn khoăn của rất nhiều khách hàng hiện nay. Bởi thị trường ghế massage tại đây rất sôi động với ...
Hướng dẫn how to remove empty rows in excel at the bottom - cách xóa các hàng trống trong excel ở dưới cùng
06-19-2007, & NBSP; 10: 56 AM #110:56 AM #1 người dùng đã đăng ký Xóa tất cả các hàng trống thêm ở dưới cùng của bảng tính Tôi có một bảng tính có 156 hàng ...