Review Dự án biopython

Kinh Nghiệm về Dự án biopython Mới Nhất

Dương Anh Sơn đang tìm kiếm từ khóa Dự án biopython được Cập Nhật vào lúc : 2022-12-15 09:50:07 . Với phương châm chia sẻ Kinh Nghiệm Hướng dẫn trong nội dung bài viết một cách Chi Tiết Mới Nhất. Nếu sau khi đọc Post vẫn ko hiểu thì hoàn toàn có thể lại phản hồi ở cuối bài để Admin lý giải và hướng dẫn lại nha.

Hướng dẫn này đáp ứng phần ra mắt cơ bản của lập trình viên Python về cách thao tá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

Nội dung chính Show
    Miền vấn đềNơi tìm mã ví dụXác định định dạng giao thức của bạnBiên dịch bộ đệm giao thức của bạnAPI bộ đệm giao thứcPhương thức nhắn tin tiêu chuẩnPhân tích cú pháp và tuần tự hóaViết một tin nhắnđọc tin nhắnMở rộng bộ đệm giao thứcSử dụng nâng cao
    Xác định định dạng tin nhắn trong tệp protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto2Sử dụng trình biên dịch bộ đệm giao thứcSử dụng API bộ đệm giao thức Python để viết và đọc tin nhắn

Đây không phải là phía 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 rõ ràng hơn, hãy xem Hướng dẫn ngôn từ bộ đệm giao thức (proto2), Hướng dẫn ngôn từ 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ụ tất cả chúng ta sẽ sử dụng là một ứng dụng "sổ địa chỉ" rất đơn giản hoàn toàn có thể đọc và ghi rõ ràng 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 mang 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 tài liệu có cấu trúc như vậy này?

    Sử dụng Python ngâm. Đây là cách tiếp cận mặc định vì nó được tích hợp vào ngôn từ, nhưng nó không xử lý tốt quá trình phát triển lược đồ và cũng không hoạt động và sinh hoạt giải trí tốt nếu bạn cần chia sẻ tài liệu với những ứng dụng được viết bằng C++ hoặc JavaBạn hoàn toàn có thể phát minh ra một cách đặc biệt để mã hóa những mục tài liệu thành một chuỗi duy nhất – ví dụ như mã hóa 4 số nguyên là "12. 3. -23. 67". Đây là một cách tiếp cận đơn giản và linh hoạt, tuy nhiên nó yêu cầu viết mã mã hóa và phân tích cú pháp một lần và việc phân tích cú pháp áp đặt một ngân sách thời gian chạy nhỏ. Điều này hoạt động và sinh hoạt giải trí tốt nhất để mã hóa tài liệu rất đơn giảnTuần tự hóa tài liệu thành XML. Cách tiếp cận này hoàn toàn có thể rất mê hoặc vì XML (gần như thể) con người hoàn toàn có thể đọc được và có những thư viện ràng buộc cho nhiều ngôn từ. Đây hoàn toàn có thể là một lựa chọn tốt nếu bạn muốn chia sẻ tài liệu với những ứng dụng/dự án công trình bất Động sản khác. Tuy nhiên, XML nổi tiếng là sử dụng nhiều không khí và việc mã hóa/giải thuật nó hoàn toàn có thể áp đặt một hình phạt hiệu suất rất lớn đối với những ứng dụng. Ngoài ra, việc điều hướng một cây XML DOM phức tạp hơn nhiều so với việc điều hướng những trường đơn giản trong một lớp thông thường.

Thay vì những tùy chọn này, bạn hoàn toà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 suất cao, tự động để xử lý và xử lý đúng chuẩn 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 tài liệu mà bạn muốn tàng 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 tài liệu bộ đệm giao thức với định dạng nhị phân hiệu suất cao. Lớp được tạo đáp ứng getters và setters cho những trường tạo nên bộ đệm giao thức và đảm nhiệm những cụ ông cụ bà thể 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 tương hỗ ý tưởng mở rộng định dạng theo thời gian sao cho mã vẫn hoàn toàn có thể đọc tài liệu được mã hóa bằng định dạng cũ

Nơi tìm mã ví dụ

Mã ví dụ được gồm có 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 khởi đầ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 tài 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.proto2syntax = "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 hoàn toà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 khởi đầu bằng một khai báo gói, giúp tránh xung đột đặt tên Một trong những dự án công trình bất Động sản rất khác nhau. Trong Python, những 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 tớ 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 khí tên Bộ đệm giao thức cũng như trong những ngôn từ không phải Python

Tiếp theo, bạn có định nghĩa tin nhắn của tớ. Một tin nhắn chỉ là một tổng hợp chứa một tập hợp những trường đã nhập. Nhiều kiểu tài liệu đơn giản tiêu chuẩn có sẵn dưới dạng những kiểu trường, gồm có

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 hoàn toàn có thể thêm cấu trúc khác cho thông báo của tớ bằng phương pháp sử dụng nhiều chủng 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í hoàn toàn có thể xác định nhiều chủng loại thư được lồng trong những thư khác – như bạn hoàn toà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 hoàn toàn có thể xác định nhiều chủng 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 những trường của tớ có một trong những list giá trị được xác định trước – ở đây bạn muốn chỉ định rằng một số trong những điện thoại hoàn toàn có thể là một trong nhiều chủng 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 hoàn toàn có thể quyết định sử dụng những thẻ đó cho những phần tử thường được sử dụng hoặc lặp lại, để lại những thẻ 16 trở lên cho những 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 những 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 những công cụ sửa đổi sau

    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; 71. trường hoàn toàn có thể hoặc không thể được đặt. Nếu giá trị trường tùy chọn không được đặt, giá trị mặc định sẽ được sử dụng. Đối với nhiều chủng loại đơn giản, bạn hoàn toàn có thể chỉ định giá trị mặc định của riêng mình, như chúng tôi đã thực hiện cho số điện thoại 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; 72 trong ví dụ. Mặt khác, mặc định khối mạng lưới hệ thống được sử dụng. số không cho những loại số, chuỗi rỗng cho chuỗi, sai cho bool. Đối với thư nhúng, giá trị mặc định luôn là "phiên bản mặc định" hoặc "nguyên mẫu" của thư, không còn trường nào được đặt. Gọi bộ truy cập để lấy giá trị của trường tùy chọn (hoặc bắt buộc) không được đặt rõ ràng luôn trả về giá trị mặc định của 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; 73. trường hoàn toàn có thể được lặp lại bất kỳ số lần nào (gồm có cả số 0). Thứ tự của những giá trị lặp lại sẽ được không thay đổi trong bộ đệm giao thức. Hãy nghĩ về những trường lặp lại dưới dạng những mảng có kích thước độngsyntax = "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. một giá trị cho trường phải được đáp ứng, nếu không, thông báo sẽ được xem là "không được khởi tạo". Nối tiếp một tin nhắn không được khởi tạo sẽ đưa ra một ngoại lệ. Phân tích cú pháp một tin nhắn không được khởi tạo sẽ không thành công. Khác với điều này, một trường bắt buộc hoạt động và sinh hoạt giải trí đúng chuẩn như một trường tùy chọn

Bắt buộc là Mãi mãi Bạn nên rất thận trọng khi đánh dấu những 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 thuở nào đ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òn trường này là không đầy đủ và hoàn toàn có thể vô tình từ chối hoặc vô hiệu chúng. Thay vào đó, bạn nên xem xét việc viết những quy trình xác thực tùy chỉnh dành riêng cho ứng dụng cho bộ đệm của tớ. Trong Google, những 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 tương hỗ những 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 – gồm có tất cả nhiều chủng loại trường hoàn toàn có thể có – trong Hướng dẫn ngôn từ bộ đệm giao thức. Tuy nhiên, đừng tìm kiếm những cơ sở tương tự như thừa kế 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ạn

Bâ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 những lớp mà bạn sẽ cần để đọc và viết những 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ìnhNếu bạn chưa setup trình biên dịch, hãy tải xuống gói "protoc" và tuân theo hướng dẫn trong READMEBây giờ hãy chạy trình biên dịch, chỉ định thư mục nguồn (nơi mã nguồn của ứng dụng của bạn tồn tại – thư mục hiện tại được sử dụng nếu bạn không đáp ứng giá trị), thư mục tiêu (nơi bạn muốn mã được tạo; thường in như protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto07 . Trong trường hợp này, bạn. protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.protoVì bạn muốn những lớp Python, bạn sử dụng tùy chọn protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto09 – những tùy chọn tương tự được đáp ứng cho những ngôn từ được tương hỗ khác

Điều này tạo ra

protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto40 trong thư mục tiêu được chỉ định của bạn

API bộ đệm giao thức

Không in 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 tài 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 những bộ mô tả đặc biệt cho tất cả thư, bảng liệt kê và trường của bạn cũng như một số trong những lớp trống bí hiểm, một lớp cho từng 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ù những cụ ông cụ bà thể về phương pháp hoạt động và sinh hoạt giải trí của những siêu tài liệu Python nằm ngoài phạm vi của hướng dẫn này, nhưng bạn hoàn toàn có thể coi chúng in như một khuôn mẫu để tạo những lớp. Tại thời điểm tải, siêu tài liệu protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto43 sử dụng những bộ mô tả đã chỉ định để tạo tất cả những phương thức Python mà bạn cần để thao tác với từng loại thông báo và thêm chúng vào những lớp có liên quan. Sau đó, bạn hoàn toàn có thể sử dụng những lớp được điền đầy đủ trong mã của tớ

Kết quả ở đầu cuối của tất cả những điều này là bạn hoàn toà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 hoàn toàn có thể viếtsyntax = "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 những trách nhiệm này sẽ không riêng gì có thêm những trường mới tùy ý vào một đối tượng Python chung. Nếu bạn nỗ lực 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 địnhprotoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto0

Để biết thêm thông tin về đúng chuẩn những thành phần mà trình biên dịch giao thức tạo ra cho bất kỳ định nghĩa trường rõ ràng nào, hãy xem tham chiếu mã do Python tạo ra

liệt kê

Enums được siêu tài liệu mở rộng thành một tập hợp những hằng số tượng trưng với những 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ó mức giá trị 2

Phương thức nhắn tin tiêu chuẩn

Mỗi lớp thông báo cũng chứa một số trong những phương thức khác được cho phép bạn kiểm tra hoặc thao tác với toàn bộ thông báo, gồm có

    protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto60. kiểm tra xem tất cả những trường bắt buộc đã được đặt chưaprotoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto61. trả về một màn biểu diễn tin nhắn mà con người hoàn toàn có thể đọc được, đặc biệt hữu ích cho việc gỡ lỗi. (Thường được gọi là protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto62 hoặc protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto63. )protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto64. ghi đè tin nhắn bằng những giá trị của tin nhắn đã choprotoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto65. xóa tất cả những phần tử trở lại trạng thái trống

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 hảo nhất 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óa

Cuối cùng, mỗi lớp bộ đệm giao thức có những phương thức để viết và đọc thông báo thuộc loại bạn đã chọn bằng phương pháp sử dụng định dạng nhị phân của cục đệm giao thức. Bao gồm những

    protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto68. tuần tự hóa tin nhắn và trả về nó dưới dạng một chuỗi. Lưu ý rằng những byte là nhị phân, không phải văn bản; protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto20. phân tích cú pháp một tin nhắn từ chuỗi đã cho

Đây chỉ là một vài tùy chọn được đáp ứng để 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 list đầ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à những bộ chứa tài liệu (như những cấu trúc trong C) không đáp ứng hiệu suất cao tương hỗ update; . 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òn quyền trấn áp 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 bộ đệm từ một dự án công trình bất Động sản khác). Trong trường hợp đó, bạn hoàn toà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 tự nhiên thiên nhiên duy nhất của ứng dụng của bạn. ẩn một số trong những tài liệu và phương thức, hiển thị những hiệu suất cao tiện lợi, v.v. Bạn không bao giờ nên thêm hành vi vào những lớp được tạo bằng phương pháp thừa kế từ chúng. Điều này sẽ phá vỡ những 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ắn

Bây giờ, hãy thử sử dụng những 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 tớ hoàn toàn có thể thực hiện là ghi thông tin thành viê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 những phiên bản của những lớp bộ đệm giao thức của tớ, 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ó nhờ vào đầu vào của người tiêu 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ángprotoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto4

đọc tin nhắn

Tấ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ức

Sớm hay muộn sau khi bạn phát hành mã sử dụng bộ đệm giao thức của tớ, chắc như đinh bạn sẽ muốn "cải tổ" định nghĩa của cục đệm giao thức. Nếu bạn muốn bộ đệm mới của tớ 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ư thể chắc như đinh muốn điều này – thì có một số trong những quy tắc bạn cần tuân theo. Trong phiên bản mới của cục đệm giao thức

    bạn không được thay đổi số thẻ của bất kỳ trường hiện có nàobạn không được thêm hoặc xóa bất kỳ trường bắt buộc nàobạn hoàn toàn có thể xóa những trường tùy chọn hoặc lặp lạibạn hoàn toàn có thể thêm những trường tùy chọn hoặc trường lặp lại mới nhưng bạn phải sử dụng số thẻ mới (nghĩa là số thẻ chưa bao giờ được sử dụng trong bộ đệm giao thức này, thậm chí không được sử dụng bởi những trường đã xóa)

(Có một số trong những ngoại lệ đối với những quy tắc này, nhưng chúng hiếm khi được sử dụng. )

Nếu bạn tuân theo những quy tắc này, mã cũ sẽ vui vẻ đọc thư mới và chỉ việc bỏ qua mọi trường mới. Đối với mã cũ, những trường tùy chọn đã bị xóa sẽ chỉ có mức giá trị mặc định và những trường lặp lại đã xóa sẽ trống. Mã mới cũng tiếp tục đọc rõ ràng những tin nhắn cũ. Tuy nhiên, hãy nhớ rằng những trường tùy chọn mới sẽ không xuất hiện trong những 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 là không hoặc đáp ứng 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 nhiều chủng 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 là không bao giờ được đặt (theo mã cũ) vì không còn cờ protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto26 cho trường đó

Sử dụng nâng cao

Bộ đệm giao thức có những hiệu suất cao vượt xa những trình truy cập và tuần tự hóa đơn giản. Hãy chắc như đinh mày mò tài liệu tham khảo API Python để xem bạn hoàn toàn có thể làm gì khác với chúng

Một tính năng chính được đáp ứng bởi những lớp bản tin giao thức là phản ánh. Bạn hoàn toàn có thể lặp lại những trường của một thông báo và thao tác những 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 rõ ràng nào. Một cách rất hữu ích để sử dụng sự phản chiếu là quy đổi những thông báo giao thức sang và từ những mã hóa khác, ví dụ như XML hoặc JSON. Việc sử dụng phản xạ nâng cao hơn hoàn toàn có thể là để tìm sự khác lạ 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 hoàn toàn có thể viết những 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 tớ, bạn hoàn toàn có thể áp dụng Bộ đệm giao thức cho nhiều vấn đề hơn bạn hoàn toàn có thể mong đợi ban đầu

Tải thêm tài liệu liên quan đến nội dung bài viết Dự án biopython programming python

Clip Dự án biopython ?

Bạn vừa Read Post Với Một số hướng dẫn một cách rõ ràng hơn về Clip Dự án biopython tiên tiến nhất

Share Link Download Dự án biopython miễn phí

Bạn đang tìm một số trong những Chia SẻLink Tải Dự án biopython miễn phí.

Giải đáp thắc mắc về Dự án biopython

Nếu sau khi đọc nội dung bài viết Dự án biopython vẫn chưa hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Mình lý giải và hướng dẫn lại nha #Dự #án #biopython