Độ phức tạp về thời gian của định dạng python
Python is the main dynamic language used at Google. Hướng dẫn về phong cách này là danh sách những điều nên làm và không nên làm đối với các chương trình Python Show
To help you format code correctly, we’ve created a settings file for Vim. Đối với Emacs, cài đặt mặc định sẽ ổn Many teams use the yapf auto-formatter to avoid arguing over formatting 2 Python Language Rules2. 1 LintRun 18 over your code using this pylintrc2. 1. 1 Definition 18 is a tool for finding bugs and style problems in Python source code. It finds problems that are typically caught by a compiler for less dynamic languages like C and C++. Because of the dynamic nature of Python, some warnings may be incorrect; however, spurious warnings should be fairly infrequent2. 1. 2 ProsCatches easy-to-miss errors like typos, using-vars-before-assignment, etc 2. 1. 3 Cons 18 isn’t perfect. To take advantage of it, sometimes we’ll need to write around it, suppress its warnings or fix it2. 1. 4 DecisionĐảm bảo bạn chạy 18 trên mã của mìnhLoại bỏ các cảnh báo nếu chúng không phù hợp để các vấn đề khác không bị ẩn. To suppress warnings, you can set a line-level comment
18 warnings are each identified by symbolic name ( 23) Google-specific warnings start with 24If the reason for the suppression is not clear from the symbolic name, add an explanation Suppressing in this way has the advantage that we can easily search for suppressions and revisit them You can get a list of 18 warnings by doingTo get more information on a particular message, use Prefer 26 to the deprecated older form 27Unused argument warnings can be suppressed by deleting the variables at the beginning of the function. Always include a comment explaining why you are deleting it. “Unused. " là đủ. For example
Other common forms of suppressing this warning include using ‘ 28’ as the identifier for the unused argument or prefixing the argument name with ‘ 29’, or assigning them to ‘ 28’. These forms are allowed but no longer encouraged. These break callers that pass arguments by name and do not enforce that the arguments are actually unused2. 2 ImportsUse 31 statements for packages and modules only, not for individual classes or functions2. 2. 1 DefinitionReusability mechanism for sharing code from one module to another 2. 2. 2 ProsThe namespace management convention is simple. The source of each identifier is indicated in a consistent way; 32 says that object 33 is defined in module 342. 2. 3 ConsModule names can still collide. Some module names are inconveniently long 2. 2. 4 Quyết định
For example the module 47 may be imported as follows 2Do not use relative names in imports. Even if the module is in the same package, use the full package name. This helps prevent unintentionally importing a package twice 2. 2. 4. 1 ExemptionsExemptions from this rule
2. 3 PackagesImport each module using the full pathname location of the module 2. 3. 1 ProsAvoids conflicts in module names or incorrect imports due to the module search path not being what the author expected. Makes it easier to find modules 2. 3. 2 ConsMakes it harder to deploy code because you have to replicate the package hierarchy. Not really a problem with modern deployment mechanisms 2. 3. 3 DecisionAll new code should import each module by its full package name Imports should be as follows 3 4(assume this file lives in 48 where 49 also exists) 7The directory the main binary is located in should not be assumed to be in 50 despite that happening in some environments. This being the case, code should assume that 51 refers to a third party or top level package named 52, not a local 492. 4 ExceptionsExceptions are allowed but must be used carefully 2. 4. 1 DefinitionExceptions are a means of breaking out of normal control flow to handle errors or other exceptional conditions 2. 4. 2 ProsThe control flow of normal operation code is not cluttered by error-handling code. It also allows the control flow to skip multiple frames when a certain condition occurs, e. g. , returning from N nested functions in one step instead of having to plumb error codes through 2. 4. 3 ConsMay cause the control flow to be confusing. Easy to miss error cases when making library calls 2. 4. 4 DecisionExceptions must follow certain conditions
2. 5 Mutable Global StateAvoid mutable global state 2. 5. 1 DefinitionModule level values or class attributes that can get mutated during program execution 2. 5. 2 ProsOccasionally useful 2. 5. 3 Cons
2. 5. 4 DecisionAvoid mutable global state In those rare cases where using global state is warranted, mutable global entities should be declared at the module level or as a class attribute and made internal by prepending an 28 to the name. If necessary, external access to mutable global state must be done through public functions or class methods. See Naming below. Please explain the design reasons why mutable global state is being used in a comment or a doc linked to from a commentModule-level constants are permitted and encouraged. For example. 71 for an internal use constant or 72 for a public API constant. Constants must be named using all caps with underscores. See Naming below2. 6 Nested/Local/Inner Classes and FunctionsNested local functions or classes are fine when used to close over a local variable. Inner classes are fine 2. 6. 1 DefinitionA class can be defined inside of a method, function, or class. A function can be defined inside a method or function. Nested functions have read-only access to variables defined in enclosing scopes 2. 6. 2 Ưu điểmAllows definition of utility classes and functions that are only used inside of a very limited scope. Very ADT-y. Commonly used for implementing decorators 2. 6. 3 ConsNested functions and classes cannot be directly tested. Nesting can make the outer function longer and less readable 2. 6. 4 DecisionThey are fine with some caveats. Avoid nested functions or classes except when closing over a local value other than 73 or 74. Do not nest a function just to hide it from users of a module. Instead, prefix its name with an _ at the module level so that it can still be accessed by tests2. 7 Comprehensions & Generator ExpressionsOkay to use for simple cases 2. 7. 1 DefinitionList, Dict, and Set comprehensions as well as generator expressions provide a concise and efficient way to create container types and iterators without resorting to the use of traditional loops, 75, 76, or 772. 7. 2 ProsSimple comprehensions can be clearer and simpler than other dict, list, or set creation techniques. Biểu thức trình tạo có thể rất hiệu quả, vì chúng tránh hoàn toàn việc tạo danh sách 2. 7. 3 nhược điểmCó thể khó đọc các biểu thức trình tạo hoặc hiểu phức tạp 2. 7. 4 Quyết địnhĐược rồi để sử dụng cho các trường hợp đơn giản. Mỗi phần phải vừa trên một dòng. biểu thức ánh xạ, mệnh đề 78, biểu thức bộ lọc. Nhiều mệnh đề 78 hoặc biểu thức bộ lọc không được phép. Thay vào đó, hãy sử dụng các vòng lặp khi mọi thứ trở nên phức tạp hơn 0 12. 8 Iterator và Operator mặc địnhSử dụng các trình lặp và toán tử mặc định cho các loại hỗ trợ chúng, như danh sách, từ điển và tệp 2. 8. 1 Định nghĩaCác loại vùng chứa, như từ điển và danh sách, xác định các trình vòng lặp mặc định và toán tử kiểm tra tư cách thành viên (“in” và “not in”) 2. 8. 2 Ưu điểmCác trình vòng lặp và toán tử mặc định rất đơn giản và hiệu quả. Chúng thể hiện thao tác trực tiếp mà không cần gọi thêm phương thức. Một hàm sử dụng các toán tử mặc định là chung chung. Nó có thể được sử dụng với bất kỳ loại nào hỗ trợ hoạt động 2. 8. 3 nhược điểmBạn không thể biết loại đối tượng bằng cách đọc tên phương thức (trừ khi biến có chú thích loại). Đây cũng là một lợi thế 2. 8. 4 Quyết địnhSử dụng các trình lặp và toán tử mặc định cho các loại hỗ trợ chúng, như danh sách, từ điển và tệp. Các loại tích hợp cũng xác định các phương thức lặp. Ưu tiên các phương thức này hơn các phương thức trả về danh sách, ngoại trừ việc bạn không nên thay đổi vùng chứa trong khi lặp lại nó 0 12. 9 máy phát điệnSử dụng máy phát điện khi cần thiết 2. 9. 1 Định nghĩaHàm tạo trả về một trình vòng lặp mang lại một giá trị mỗi khi nó thực thi câu lệnh năng suất. Sau khi nó mang lại một giá trị, trạng thái thời gian chạy của hàm tạo bị tạm dừng cho đến khi cần giá trị tiếp theo 2. 9. 2 Ưu điểmMã đơn giản hơn, vì trạng thái của các biến cục bộ và luồng điều khiển được giữ nguyên cho mỗi cuộc gọi. Trình tạo sử dụng ít bộ nhớ hơn so với hàm tạo toàn bộ danh sách giá trị cùng một lúc 2. 9. 3 nhược điểmCác biến cục bộ trong trình tạo sẽ không được thu gom rác cho đến khi trình tạo bị tiêu thụ đến mức cạn kiệt hoặc chính nó đã được thu gom rác 2. 9. 4 Quyết địnhKhỏe. Sử dụng “Năng suất. ” thay vì “Trả về. ” trong chuỗi tài liệu cho các hàm tạo Nếu trình tạo quản lý một tài nguyên đắt tiền, hãy đảm bảo buộc dọn sạch Một cách hay để dọn dẹp là bọc trình tạo bằng trình quản lý ngữ cảnh PEP-0533 2. 10 Hàm LambdaĐược rồi cho một lớp lót. Thích các biểu thức trình tạo hơn 75 hoặc 76 với một 772. 10. 1 Định nghĩaLambdas định nghĩa các hàm ẩn danh trong một biểu thức, trái ngược với một câu lệnh 2. 10. 2 Ưu điểmThuận tiện 2. 10. 3 nhược điểmKhó đọc và gỡ lỗi hơn các chức năng cục bộ. Việc thiếu tên có nghĩa là dấu vết ngăn xếp khó hiểu hơn. Tính biểu cảm bị hạn chế vì chức năng chỉ có thể chứa một biểu thức 2. 10. 4 Quyết địnhĐược rồi để sử dụng chúng cho một lớp lót. If the code inside the lambda function is longer than 60-80 chars, it’s probably better to define it as a regular nested function Đối với các hoạt động phổ biến như phép nhân, hãy sử dụng các hàm từ mô-đun 83 thay vì các hàm lambda. Ví dụ: thích 84 hơn 852. 11 Biểu thức điều kiệnĐược rồi cho các trường hợp đơn giản 2. 11. 1 Định nghĩaBiểu thức điều kiện (đôi khi được gọi là “toán tử bậc ba”) là cơ chế cung cấp cú pháp ngắn hơn cho câu lệnh if. Ví dụ. 862. 11. 2 Ưu điểmNgắn gọn và thuận tiện hơn câu lệnh if 2. 11. 3 nhược điểmCó thể khó đọc hơn câu lệnh if. Điều kiện có thể khó xác định nếu biểu thức dài 2. 11. 4 Quyết địnhĐược rồi để sử dụng cho các trường hợp đơn giản. Mỗi phần phải vừa trên một dòng. biểu thức đúng, biểu thức if, biểu thức khác. Sử dụng câu lệnh if hoàn chỉnh khi mọi thứ trở nên phức tạp hơn 2 32. 12 giá trị đối số mặc địnhĐược rồi trong hầu hết các trường hợp 2. 12. 1 Định nghĩaBạn có thể chỉ định giá trị cho các biến ở cuối danh sách tham số của hàm, chẳng hạn như. g. , 87. Nếu 88 được gọi chỉ với một đối số, thì 89 được đặt thành 0. Nếu nó được gọi với hai đối số, thì 89 có giá trị của đối số thứ hai2. 12. 2 Ưu điểmThường thì bạn có một hàm sử dụng nhiều giá trị mặc định, nhưng trong một số trường hợp hiếm hoi, bạn muốn ghi đè lên các giá trị mặc định. Các giá trị đối số mặc định cung cấp một cách dễ dàng để thực hiện việc này mà không cần phải xác định nhiều hàm cho các trường hợp ngoại lệ hiếm gặp. Vì Python không hỗ trợ các phương thức/hàm quá tải, nên các đối số mặc định là một cách dễ dàng để “làm giả” hành vi quá tải 2. 12. 3 nhược điểmCác đối số mặc định được đánh giá một lần tại thời điểm tải mô-đun. Điều này có thể gây ra sự cố nếu đối số là đối tượng có thể thay đổi, chẳng hạn như danh sách hoặc từ điển. Nếu chức năng sửa đổi đối tượng (e. g. , bằng cách thêm một mục vào danh sách), giá trị mặc định được sửa đổi 2. 12. 4 Quyết địnhĐược rồi để sử dụng với cảnh báo sau Không sử dụng các đối tượng có thể thay đổi làm giá trị mặc định trong định nghĩa hàm hoặc phương thức 4 52. 13 thuộc tínhCác thuộc tính có thể được sử dụng để kiểm soát việc nhận hoặc thiết lập các thuộc tính yêu cầu tính toán hoặc logic thông thường. Việc triển khai thuộc tính phải phù hợp với kỳ vọng chung của quyền truy cập thuộc tính thông thường. rằng chúng rẻ, đơn giản và không gây ngạc nhiên 2. 13. 1 Định nghĩaMột cách để gói các cuộc gọi phương thức để nhận và đặt thuộc tính làm quyền truy cập thuộc tính tiêu chuẩn 2. 13. 2 Ưu điểm
2. 13. 3 nhược điểm
2. 13. 4 Quyết địnhCác thuộc tính được cho phép, nhưng, giống như quá tải toán tử, chỉ nên được sử dụng khi cần thiết và phù hợp với mong đợi của truy cập thuộc tính điển hình; Ví dụ: không được phép sử dụng một thuộc tính để lấy và đặt một thuộc tính nội bộ. không có tính toán xảy ra, vì vậy thuộc tính là không cần thiết (thay vào đó hãy đặt thuộc tính công khai). Trong khi đó, việc sử dụng một thuộc tính để kiểm soát quyền truy cập thuộc tính hoặc để tính toán một giá trị có nguồn gốc tầm thường được cho phép. logic rất đơn giản và không có gì đáng ngạc nhiên Các thuộc tính nên được tạo bằng trình trang trí 91. Thực hiện thủ công một bộ mô tả thuộc tính được coi là một tính năng quyền lựcKế thừa với các thuộc tính có thể không rõ ràng. Không sử dụng các thuộc tính để thực hiện tính toán mà một lớp con có thể muốn ghi đè và mở rộng 2. 14 Đánh giá Đúng/SaiSử dụng sai "ngầm" nếu có thể 2. 14. 1 Định nghĩaPython đánh giá các giá trị nhất định là 92 khi ở trong ngữ cảnh boolean. Một "quy tắc ngón tay cái" nhanh chóng là tất cả các giá trị "trống rỗng" đều được coi là sai, vì vậy tất cả các giá trị 93 đều được đánh giá là sai trong ngữ cảnh boolean2. 14. 2 Ưu điểmCác điều kiện sử dụng booleans Python dễ đọc hơn và ít bị lỗi hơn. Trong hầu hết các trường hợp, chúng cũng nhanh hơn 2. 14. 3 nhược điểmCó thể trông lạ đối với các nhà phát triển C/C++ 2. 14. 4 Quyết địnhSử dụng sai “ngầm” nếu có thể, e. g. , 94 thay vì 95. Có một vài cảnh báo mà bạn nên ghi nhớ mặc dù
2. 16 Phạm vi từ vựngĐược rồi để sử dụng 2. 16. 1 Định nghĩaMột hàm Python lồng nhau có thể tham chiếu đến các biến được xác định trong các hàm kèm theo, nhưng không thể gán cho chúng. Các liên kết biến được giải quyết bằng cách sử dụng phạm vi từ vựng, nghĩa là dựa trên văn bản chương trình tĩnh. Bất kỳ sự gán nào cho một tên trong một khối sẽ khiến Python coi tất cả các tham chiếu đến tên đó là một biến cục bộ, ngay cả khi việc sử dụng có trước sự gán. Nếu một khai báo toàn cầu xảy ra, tên được coi là một biến toàn cầu Một ví dụ về việc sử dụng tính năng này là 82. 16. 2 Ưu điểmThường dẫn đến mã rõ ràng hơn, thanh lịch hơn. Đặc biệt an ủi các lập trình viên Lisp và Scheme (và Haskell, ML và…) có kinh nghiệm 2. 16. 3 nhược điểmCó thể dẫn đến các lỗi khó hiểu. Chẳng hạn như ví dụ này dựa trên PEP-0227 9So 217 will print 218, not 2192. 16. 4 Quyết địnhĐược rồi để sử dụng 2. 17 Trình trang trí chức năng và phương thứcSử dụng decorators một cách thận trọng khi có một lợi thế rõ ràng. Tránh 220 và hạn chế sử dụng 2212. 17. 1 Định nghĩaTrình trang trí cho Hàm và Phương thức (a. k. một “ký hiệu 222”). Một trình trang trí phổ biến là 91, được sử dụng để chuyển đổi các phương thức thông thường thành các thuộc tính được tính toán động. Tuy nhiên, cú pháp của trình trang trí cũng cho phép các trình trang trí do người dùng định nghĩa. Cụ thể, đối với một số chức năng 224, điều này 20tương đương với 212. 17. 2 Ưu điểmChỉ định một cách trang nhã một số chuyển đổi trên một phương thức; 2. 17. 3 nhược điểmTrình trang trí có thể thực hiện các thao tác tùy ý trên đối số của hàm hoặc trả về giá trị, dẫn đến hành vi ngầm đáng ngạc nhiên. Ngoài ra, các trình trang trí thực thi tại thời điểm xác định đối tượng. Đối với các đối tượng cấp mô-đun (lớp, chức năng mô-đun,…) điều này xảy ra tại thời điểm nhập. Lỗi trong mã trang trí hầu như không thể phục hồi từ 2. 17. 4 Quyết địnhSử dụng decorators một cách thận trọng khi có một lợi thế rõ ràng. Người trang trí phải tuân theo các nguyên tắc nhập và đặt tên giống như các chức năng. Trình trang trí pydoc phải nêu rõ rằng chức năng này là một trình trang trí. Viết bài kiểm tra đơn vị cho người trang trí Tránh các phụ thuộc bên ngoài trong chính trình trang trí (e. g. không dựa vào tệp, ổ cắm, kết nối cơ sở dữ liệu, v.v. ), since they might not be available when the decorator runs (at import time, perhaps from 225 or other tools). Một trình trang trí được gọi với các tham số hợp lệ phải (càng nhiều càng tốt) được đảm bảo thành công trong mọi trường hợpDecorators are a special case of “top level code” - see main for more discussion Never use 220 unless forced to in order to integrate with an API defined in an existing library. Write a module level function insteadUse 221 only when writing a named constructor, or a class-specific routine that modifies necessary global state such as a process-wide cache2. 18 ThreadingKhông dựa vào tính nguyên tử của các loại tích hợp Mặc dù các kiểu dữ liệu tích hợp sẵn của Python, chẳng hạn như từ điển, dường như có các hoạt động nguyên tử, nhưng có một số trường hợp chúng không phải là nguyên tử (e. g. nếu 228 hoặc 229 được triển khai dưới dạng các phương thức Python) và không nên dựa vào tính nguyên tử của chúng. Bạn cũng không nên dựa vào phép gán biến nguyên tử (vì điều này lại phụ thuộc vào từ điển)Sử dụng kiểu dữ liệu 230 của mô-đun Hàng đợi làm cách ưa thích để giao tiếp dữ liệu giữa các luồng. Nếu không, hãy sử dụng mô-đun luồng và các nguyên hàm khóa của nó. Ưu tiên các biến điều kiện và 231 thay vì sử dụng các khóa cấp thấp hơn2. 19 Tính năng nguồnTránh các tính năng này 2. 19. 1 Định nghĩaPython là một ngôn ngữ cực kỳ linh hoạt và cung cấp cho bạn nhiều tính năng ưa thích như siêu dữ liệu tùy chỉnh, quyền truy cập vào mã byte, biên dịch nhanh, kế thừa động, sửa chữa đối tượng, hack nhập, phản chiếu (e. g. một số cách sử dụng của 232), sửa đổi nội bộ hệ thống, phương pháp 233 thực hiện dọn dẹp tùy chỉnh, v.v.2. 19. 2 Ưu điểmĐây là những tính năng ngôn ngữ mạnh mẽ. Họ có thể làm cho mã của bạn gọn hơn 2. 19. 3 nhược điểmRất hấp dẫn khi sử dụng những tính năng “hay ho” này khi chúng không thực sự cần thiết. Khó đọc, hiểu và gỡ lỗi mã đang sử dụng các tính năng bất thường bên dưới. Thoạt đầu có vẻ không phải như vậy (đối với tác giả gốc), nhưng khi xem lại mã, nó có xu hướng khó hơn mã dài hơn nhưng đơn giản 2. 19. 4 Quyết địnhTránh các tính năng này trong mã của bạn Các mô-đun và lớp thư viện tiêu chuẩn sử dụng nội bộ các tính năng này đều được phép sử dụng (ví dụ: 234, 235 và 236)2. 20 Modern Python. từ __future__ nhập khẩuCác thay đổi ngữ nghĩa của phiên bản ngôn ngữ mới có thể được kiểm soát sau quá trình nhập đặc biệt trong tương lai để kích hoạt chúng trên cơ sở từng tệp trong thời gian chạy trước đó 2. 20. 1 Định nghĩaCó thể bật một số tính năng hiện đại hơn thông qua câu lệnh 237 cho phép sử dụng sớm các tính năng từ các phiên bản Python dự kiến trong tương lai2. 20. 2 Ưu điểmĐiều này đã được chứng minh là giúp nâng cấp phiên bản thời gian chạy mượt mà hơn vì các thay đổi có thể được thực hiện trên cơ sở từng tệp trong khi khai báo tính tương thích và ngăn chặn hồi quy trong các tệp đó. Mã hiện đại dễ bảo trì hơn vì ít có khả năng tích lũy nợ kỹ thuật sẽ gây ra sự cố trong quá trình nâng cấp thời gian chạy trong tương lai 2. 20. 3 nhược điểmMã như vậy có thể không hoạt động trên các phiên bản thông dịch viên rất cũ trước khi đưa ra câu lệnh tương lai cần thiết. Nhu cầu này phổ biến hơn trong các dự án hỗ trợ rất nhiều môi trường 2. 20. 4 Quyết địnhtừ __future__ nhập khẩuViệc sử dụng các câu lệnh 237 được khuyến khích. Nó cho phép một tệp nguồn nhất định bắt đầu sử dụng các tính năng cú pháp Python hiện đại hơn ngày nay. Sau khi bạn không còn cần chạy trên phiên bản có các tính năng bị ẩn đằng sau lần nhập 239, vui lòng xóa các dòng đóTrong mã có thể thực thi trên các phiên bản cũ như 3. 5 thay vì >= 3. 7, nhập khẩu 22Để biết thêm thông tin, hãy đọc tài liệu định nghĩa câu lệnh tương lai của Python Vui lòng không xóa các mục nhập này cho đến khi bạn tin rằng mã này chỉ được sử dụng trong một môi trường đủ hiện đại. Even if you do not currently use the feature a specific future import enables in your code today, keeping it in place in the file prevents later modifications of the code from inadvertently depending on the older behavior Sử dụng các báo cáo nhập khẩu 240 khác khi bạn thấy phù hợp2. 21 Loại mã chú thíchBạn có thể chú thích mã Python bằng gợi ý loại theo PEP-484 và kiểm tra loại mã khi xây dựng bằng công cụ kiểm tra loại như pytype Chú thích loại có thể có trong nguồn hoặc trong tệp pyi còn sơ khai. Bất cứ khi nào có thể, chú thích nên ở trong nguồn. Sử dụng tệp pyi cho bên thứ ba hoặc mô-đun mở rộng 2. 21. 1 Định nghĩaChú thích kiểu (hoặc "gợi ý kiểu") dành cho hàm hoặc đối số phương thức và giá trị trả về 23Bạn cũng có thể khai báo loại biến bằng cú pháp PEP-526 tương tự 2. 21. 2 Ưu điểmLoại chú thích cải thiện khả năng đọc và bảo trì mã của bạn. Trình kiểm tra loại sẽ chuyển đổi nhiều lỗi thời gian chạy thành lỗi thời gian xây dựng và giảm khả năng sử dụng các Tính năng mạnh mẽ của bạn 2. 21. 3 nhược điểmBạn sẽ phải cập nhật các khai báo kiểu. Bạn có thể thấy lỗi loại mà bạn nghĩ là mã hợp lệ. Việc sử dụng trình kiểm tra loại có thể làm giảm khả năng sử dụng các Tính năng Nguồn của bạn 2. 21. 4 Quyết địnhBạn được khuyến khích bật phân tích kiểu Python khi cập nhật mã. Khi thêm hoặc sửa đổi API công khai, hãy bao gồm các chú thích loại và cho phép kiểm tra qua pytype trong hệ thống xây dựng. Vì phân tích tĩnh còn tương đối mới đối với Python, chúng tôi thừa nhận rằng các tác dụng phụ không mong muốn (chẳng hạn như các loại được suy luận sai) có thể ngăn một số dự án áp dụng. Trong những trường hợp đó, các tác giả được khuyến khích thêm nhận xét bằng TODO hoặc liên kết đến lỗi mô tả (các) sự cố hiện đang ngăn cản việc áp dụng chú thích loại trong tệp BUILD hoặc trong chính mã nếu phù hợp 3 quy tắc kiểu Python3. 1 dấu chấm phẩyKhông kết thúc dòng của bạn bằng dấu chấm phẩy và không sử dụng dấu chấm phẩy để đặt hai câu lệnh trên cùng một dòng 3. 2 Chiều dài dòngĐộ dài dòng tối đa là 80 ký tự Ngoại lệ rõ ràng đối với giới hạn 80 ký tự
Do not use backslash line continuation except for 242 statements requiring three or more context managersMake use of Python’s implicit line joining inside parentheses, brackets and braces. If necessary, you can add an extra pair of parentheses around an expression 24When a literal string won’t fit on a single line, use parentheses for implicit line joining 25Within comments, put long URLs on their own line if necessary 26 27It is permissible to use backslash continuation when defining a 242 statement with three or more context managers. For two context managers, use a nested 242 statement 28 29 30Make note of the indentation of the elements in the line continuation examples above; see the indentation section for explanation In all other cases where a line exceeds 80 characters, and the yapf auto-formatter does not help bring the line below the limit, the line is allowed to exceed this maximum. Authors are encouraged to manually break the line up per the notes above when it is sensible 3. 3 ParenthesesUse parentheses sparingly It is fine, though not required, to use parentheses around tuples. Do not use them in return statements or conditional statements unless using parentheses for implied line continuation or to indicate a tuple 31 323. 4 IndentationIndent your code blocks with 4 spaces Không bao giờ sử dụng các tab. Implied line continuation should align wrapped elements vertically (see line length examples), or use a hanging 4-space indent. Closing (round, square or curly) brackets can be placed at the end of the expression, or on separate lines, but then should be indented the same as the line with the corresponding opening bracket 33 343. 4. 1 Trailing commas in sequences of items?Dấu phẩy ở cuối trong chuỗi các mục chỉ được khuyến nghị khi mã thông báo vùng chứa đóng 245, 246 hoặc 247 không xuất hiện trên cùng một dòng với phần tử cuối cùng. Sự hiện diện của dấu phẩy ở cuối cũng được sử dụng như một gợi ý cho trình định dạng tự động mã Python YAPF của chúng tôi để hướng dẫn nó tự động định dạng vùng chứa các mục thành một mục trên mỗi dòng khi có ____ ______3248 sau phần tử cuối cùng 353. 5 dòng trốngHai dòng trống giữa các định nghĩa cấp cao nhất, có thể là định nghĩa hàm hoặc lớp. Một dòng trống giữa các định nghĩa phương thức và giữa chuỗi tài liệu của 249 và phương thức đầu tiên. Không có dòng trống nào sau dòng 250. Sử dụng các dòng trống đơn khi bạn đánh giá phù hợp trong các hàm hoặc phương thứcCác dòng trống không cần phải được neo vào định nghĩa. Ví dụ: các nhận xét liên quan ngay trước các định nghĩa hàm, lớp và phương thức có thể có ý nghĩa. Cân nhắc xem nhận xét của bạn có thể hữu ích hơn như một phần của chuỗi tài liệu không 3. 6 Khoảng trắngThực hiện theo các quy tắc đánh máy tiêu chuẩn để sử dụng khoảng trắng xung quanh dấu chấm câu Không có khoảng trắng bên trong dấu ngoặc đơn, dấu ngoặc hoặc dấu ngoặc nhọn 36 37Không có khoảng trắng trước dấu phẩy, dấu chấm phẩy hoặc dấu hai chấm. Sử dụng khoảng trắng sau dấu phẩy, dấu chấm phẩy hoặc dấu hai chấm, ngoại trừ ở cuối dòng 38 39Không có khoảng trắng trước dấu ngoặc đơn/ngoặc mở bắt đầu danh sách đối số, lập chỉ mục hoặc cắt 40 41Không có khoảng trắng ở cuối Bao quanh các toán tử nhị phân với một khoảng trắng ở hai bên để gán ( 251), so sánh ( 252) và Booleans ( 253). Sử dụng phán đoán tốt hơn của bạn để chèn khoảng trắng xung quanh các toán tử số học ( 254, 255, 256, 257, 258, 259, 260, 222)Không bao giờ sử dụng khoảng trắng xung quanh 251 khi chuyển đối số từ khóa hoặc xác định giá trị tham số mặc định, với một ngoại lệ. khi có chú thích loại, hãy sử dụng khoảng trắng xung quanh 251 cho giá trị tham số mặc định 42 43Don’t use spaces to vertically align tokens on consecutive lines, since it becomes a maintenance burden (applies to 264, 265, 251, etc. ) 44 453. 7 dòng ShebangHầu hết các tệp 267 không cần bắt đầu bằng dòng 268. Bắt đầu tệp chính của chương trình với 269 (để hỗ trợ virtualenv) hoặc 270 mỗi PEP-394Dòng này được nhân sử dụng để tìm trình thông dịch Python, nhưng bị Python bỏ qua khi nhập mô-đun. Nó chỉ cần thiết trên một tệp dự định được thực thi trực tiếp Đảm bảo sử dụng đúng kiểu cho mô-đun, hàm, chuỗi tài liệu phương thức và nhận xét nội tuyến 3. 8. 1 tài liệuPython sử dụng docstrings để mã tài liệu. Chuỗi tài liệu là một chuỗi là câu lệnh đầu tiên trong gói, mô-đun, lớp hoặc hàm. Các chuỗi này có thể được trích xuất tự động thông qua thành viên 271 của đối tượng và được sử dụng bởi 225. (Hãy thử chạy 225 trên mô-đun của bạn để xem nó trông như thế nào. ) Luôn sử dụng định dạng ba trích dẫn kép 274 cho các chuỗi tài liệu (theo PEP 257). Chuỗi tài liệu phải được tổ chức dưới dạng một dòng tóm tắt (một dòng vật lý không quá 80 ký tự) được kết thúc bằng dấu chấm, dấu chấm hỏi hoặc dấu chấm than. Khi viết thêm (khuyến khích), dòng này phải được theo sau bởi một dòng trống, tiếp theo là phần còn lại của chuỗi tài liệu bắt đầu ở cùng vị trí con trỏ với trích dẫn đầu tiên của dòng đầu tiên. Có nhiều hướng dẫn định dạng hơn cho các tài liệu bên dưới3. 8. 2 mô-đunMỗi tệp phải chứa giấy phép soạn sẵn. Chọn bản soạn sẵn thích hợp cho giấy phép được dự án sử dụng (ví dụ: Apache 2. 0, BSD, LGPL, GPL) Các tệp phải bắt đầu bằng một chuỗi tài liệu mô tả nội dung và cách sử dụng mô-đun 463. 8. 2. 1 mô-đun thử nghiệmKhông bắt buộc phải có chuỗi tài liệu cấp mô-đun cho các tệp thử nghiệm. Chúng chỉ nên được đưa vào khi có thông tin bổ sung có thể được cung cấp Các ví dụ bao gồm một số chi tiết cụ thể về cách chạy thử nghiệm, giải thích về mẫu thiết lập bất thường, sự phụ thuộc vào môi trường bên ngoài, v.v. 47Không nên sử dụng các chuỗi tài liệu không cung cấp bất kỳ thông tin mới nào 3. 8. 3 Hàm và Phương thứcTrong phần này, "hàm" có nghĩa là một phương thức, chức năng, trình tạo hoặc thuộc tính Một chuỗi tài liệu là bắt buộc đối với mọi chức năng có một hoặc nhiều thuộc tính sau
Một chuỗi tài liệu phải cung cấp đủ thông tin để viết lệnh gọi đến hàm mà không cần đọc mã của hàm. Chuỗi tài liệu phải mô tả cú pháp gọi của hàm và ngữ nghĩa của nó, nhưng nói chung không phải là chi tiết triển khai của nó, trừ khi những chi tiết đó có liên quan đến cách sử dụng hàm. Ví dụ: một hàm thay đổi một trong các đối số của nó dưới dạng tác dụng phụ cần lưu ý rằng trong chuỗi tài liệu của nó. Mặt khác, các chi tiết tinh tế nhưng quan trọng về việc triển khai chức năng không liên quan đến người gọi sẽ được thể hiện dưới dạng nhận xét bên cạnh mã tốt hơn là trong chuỗi tài liệu của chức năng Chuỗi tài liệu có thể là kiểu mô tả (______3275) hoặc kiểu mệnh lệnh ( 276), nhưng kiểu này phải nhất quán trong một tệp. Chuỗi tài liệu cho bộ mô tả dữ liệu 91 phải sử dụng cùng kiểu với chuỗi tài liệu cho thuộc tính hoặc đối số hàm ( 278, thay vì 279)Một phương thức ghi đè một phương thức từ lớp cơ sở có thể có một chuỗi tài liệu đơn giản gửi trình đọc đến chuỗi tài liệu của phương thức được ghi đè, chẳng hạn như 280. Cơ sở lý luận là không cần phải lặp lại ở nhiều nơi tài liệu đã có trong chuỗi tài liệu của phương thức cơ sở. Tuy nhiên, nếu hành vi của phương thức ghi đè về cơ bản khác với phương thức bị ghi đè hoặc cần cung cấp thông tin chi tiết (e. g. , ghi lại các tác dụng phụ bổ sung), một chuỗi tài liệu có ít nhất những điểm khác biệt đó là bắt buộc đối với phương thức ghi đèMột số khía cạnh của một chức năng nên được ghi lại trong các phần đặc biệt, được liệt kê bên dưới. Mỗi phần bắt đầu bằng một dòng tiêu đề, kết thúc bằng dấu hai chấm. Tất cả các phần không phải là tiêu đề nên duy trì thụt lề treo hai hoặc bốn khoảng trắng (nhất quán trong một tệp). Các phần này có thể được bỏ qua trong trường hợp tên và chữ ký của hàm đủ thông tin để có thể mô tả chính xác bằng cách sử dụng chuỗi tài liệu một dòng lập luận. Liệt kê từng tham số theo tên. Mô tả phải theo sau tên và được phân tách bằng dấu hai chấm, sau đó là khoảng trắng hoặc xuống dòng. Nếu mô tả quá dài để vừa với một dòng 80 ký tự, hãy sử dụng thụt lề treo nhiều hơn 2 hoặc 4 khoảng trắng so với tên tham số (nhất quán với phần còn lại của chuỗi tài liệu trong tệp). Mô tả phải bao gồm (các) loại bắt buộc nếu mã không chứa chú thích loại tương ứng. Nếu một hàm chấp nhận 281 (danh sách đối số có độ dài thay đổi) và/hoặc 282 (đối số từ khóa tùy ý), thì chúng phải được liệt kê là 281 và 282. trả lại. (hoặc Sản lượng. cho trình tạo) Mô tả loại và ngữ nghĩa của giá trị trả về. Nếu hàm chỉ trả về Không thì không cần phần này. Nó cũng có thể được bỏ qua nếu chuỗi tài liệu bắt đầu bằng Returns hoặc Yields (e. g. 285) và câu mở đầu đủ để mô tả giá trị trả về. Không bắt chước 'kiểu NumPy' (ví dụ), kiểu này thường ghi lại giá trị trả về của bộ dữ liệu như thể đó là nhiều giá trị trả về với các tên riêng lẻ (không bao giờ đề cập đến bộ dữ liệu). Thay vào đó, hãy mô tả một giá trị trả về như. “Trả về. Một bộ (mat_a, mat_b), trong đó mat_a là …, và…”. Các tên phụ trợ trong chuỗi tài liệu không nhất thiết phải tương ứng với bất kỳ tên nội bộ nào được sử dụng trong thân hàm (vì chúng không phải là một phần của API). tăng. Liệt kê tất cả các ngoại lệ có liên quan đến giao diện theo sau là mô tả. Sử dụng tên ngoại lệ tương tự + dấu hai chấm + dấu cách hoặc dòng mới và kiểu thụt lề treo như được mô tả trong Args. Bạn không nên ghi lại các trường hợp ngoại lệ được nêu ra nếu API được chỉ định trong chuỗi tài liệu bị vi phạm (vì điều này nghịch lý sẽ tạo ra hành vi vi phạm phần API của API) 48Tương tự, biến thể này trên 286 có ngắt dòng cũng được cho phép 493. 8. 4 lớpCác lớp nên có một chuỗi tài liệu bên dưới định nghĩa lớp mô tả lớp. Nếu lớp của bạn có các thuộc tính công khai, chúng phải được ghi lại ở đây trong phần 287 và tuân theo cùng định dạng như phần 288 của hàm 70Tất cả các chuỗi tài liệu lớp phải bắt đầu bằng một bản tóm tắt một dòng mô tả nội dung mà thể hiện của lớp đại diện. Điều này ngụ ý rằng các lớp con của 60 cũng nên mô tả ngoại lệ đại diện cho cái gì chứ không phải bối cảnh mà nó có thể xảy ra. Chuỗi tài liệu lớp không được lặp lại thông tin không cần thiết, chẳng hạn như lớp là một lớp 71 723. 8. 5 Khối và Nhận xét Nội tuyếnNơi cuối cùng để có nhận xét là ở những phần phức tạp của mã. Nếu bạn phải giải thích nó trong lần đánh giá mã tiếp theo, bạn nên bình luận ngay bây giờ. Complicated operations get a few lines of comments before the operations commence. Những người không rõ ràng nhận được bình luận ở cuối dòng 73To improve legibility, these comments should start at least 2 spaces away from the code with the comment character 265, followed by at least one space before the text of the comment itselfMặt khác, không bao giờ mô tả mã. Assume the person reading the code knows Python (though not what you’re trying to do) better than you do 743. 8. 6 Dấu câu, Chính tả và Ngữ phápPay attention to punctuation, spelling, and grammar; it is easier to read well-written comments than badly written ones Comments should be as readable as narrative text, with proper capitalization and punctuation. In many cases, complete sentences are more readable than sentence fragments. Các chú thích ngắn hơn, chẳng hạn như chú thích ở cuối dòng mã, đôi khi có thể kém trang trọng hơn, nhưng bạn nên nhất quán với phong cách của mình Mặc dù có thể khó chịu khi người đánh giá mã chỉ ra rằng bạn đang sử dụng dấu phẩy trong khi lẽ ra bạn nên sử dụng dấu chấm phẩy, nhưng điều rất quan trọng là mã nguồn phải duy trì mức độ rõ ràng và dễ đọc cao. Dấu chấm câu, chính tả và ngữ pháp phù hợp giúp đạt được mục tiêu đó 3. 10 DâySử dụng chuỗi f, toán tử 259 hoặc phương pháp 292 để định dạng chuỗi, ngay cả khi các tham số đều là chuỗi. Sử dụng phán đoán tốt nhất của bạn để quyết định giữa các tùy chọn định dạng chuỗi. Một liên kết duy nhất với 254 thì được nhưng không định dạng với 254 75 76Tránh sử dụng các toán tử 254 và 296 để tích lũy một chuỗi trong một vòng lặp. Trong một số điều kiện, tích lũy một chuỗi với phép cộng có thể dẫn đến thời gian chạy bậc hai thay vì tuyến tính. Although common accumulations of this sort may be optimized on CPython, that is an implementation detail. Các điều kiện áp dụng tối ưu hóa không dễ dự đoán và có thể thay đổi. Thay vào đó, hãy thêm từng chuỗi con vào danh sách và 297 danh sách sau khi vòng lặp kết thúc hoặc ghi từng chuỗi con vào bộ đệm 298. Các kỹ thuật này luôn có độ phức tạp thời gian chạy tuyến tính được khấu hao 77 78Hãy nhất quán với sự lựa chọn của bạn về ký tự trích dẫn chuỗi trong một tệp. Pick 299 or 300 and stick with it. It is okay to use the other quote character on a string to avoid the need to backslash-escape quote characters within the string 79 50Prefer 274 for multi-line strings rather than 302. Projects may choose to use 302 for all non-docstring multi-line strings if and only if they also use 299 for regular strings. Docstrings must use 274 regardlessCác chuỗi nhiều dòng không chạy với phần thụt đầu dòng của phần còn lại của chương trình. Nếu bạn cần tránh nhúng thêm khoảng trắng vào chuỗi, hãy sử dụng chuỗi một dòng được nối hoặc chuỗi nhiều dòng với 306 để xóa khoảng trắng ban đầu trên mỗi dòng 51 52 53 54 553. 10. 1 nhật kýĐối với các chức năng ghi nhật ký yêu cầu một chuỗi mẫu (với %-placeholders) làm đối số đầu tiên của chúng. Always call them with a string literal (not an f-string. ) as their first argument with pattern-parameters as subsequent arguments. Một số triển khai ghi nhật ký thu thập chuỗi mẫu chưa được mở rộng dưới dạng trường có thể truy vấn. Nó cũng ngăn việc dành thời gian hiển thị thông báo mà không có trình ghi nhật ký nào được định cấu hình để xuất 56 57 583. 10. 2 Error MessagesThông báo lỗi (chẳng hạn như. chuỗi thông báo về các trường hợp ngoại lệ như 54 hoặc thông báo được hiển thị cho người dùng) phải tuân theo ba nguyên tắc
59 603. 11 Files, Sockets, and similar Stateful ResourcesExplicitly close files and sockets when done with them. Quy tắc này tự nhiên mở rộng cho các tài nguyên có thể đóng được sử dụng ổ cắm bên trong, chẳng hạn như kết nối cơ sở dữ liệu và cả các tài nguyên khác cần được đóng theo cách tương tự. Chỉ kể tên một vài ví dụ, điều này cũng bao gồm ánh xạ mmap, đối tượng Tệp h5py và matplotlib. pyplot figure windows Leaving files, sockets or other such stateful objects open unnecessarily has many downsides
Hơn nữa, trong khi các tệp và ổ cắm (và một số tài nguyên hoạt động tương tự) tự động đóng khi đối tượng bị hủy, thì việc ghép thời gian tồn tại của đối tượng với trạng thái của tài nguyên là một cách thực hành kém.
Việc dựa vào các công cụ hoàn thiện để thực hiện dọn dẹp tự động có các tác dụng phụ có thể quan sát được đã được khám phá lại nhiều lần để dẫn đến các vấn đề lớn, qua nhiều thập kỷ và nhiều ngôn ngữ (xem e. g. bài viết này cho Java) Cách ưu tiên để quản lý tệp và các tài nguyên tương tự là sử dụng câu lệnh 242 61For file-like objects that do not support the 242 statement, use 311 62Trong những trường hợp hiếm hoi khi quản lý tài nguyên dựa trên ngữ cảnh là không khả thi, tài liệu mã phải giải thích rõ ràng cách quản lý thời gian tồn tại của tài nguyên Use 312 comments for code that is temporary, a short-term solution, or good-enough but not perfectNhận xét 312 bắt đầu bằng từ 312 viết hoa toàn bộ và một mã định danh ngữ cảnh được đặt trong ngoặc đơn. Lý tưởng nhất là tham chiếu lỗi, đôi khi là tên người dùng. Một tài liệu tham khảo lỗi như 315 thích hợp hơn, bởi vì các lỗi được theo dõi và có các nhận xét tiếp theo, trong khi các cá nhân di chuyển xung quanh và có thể mất bối cảnh theo thời gian. 312 được theo sau bởi một lời giải thích về những việc phải làmMục đích để có định dạng 312 nhất quán có thể tìm kiếm để biết cách lấy thêm chi tiết. 312 không phải là cam kết rằng người được giới thiệu sẽ khắc phục sự cố. Vì vậy, khi bạn tạo một 312 với tên người dùng, thì hầu như tên người dùng của bạn luôn được cung cấp 63If your 312 is of the form “At a future date do something” make sure that you either include a very specific date (“Fix by November 2009”) or a very specific event (“Remove this code when all clients can handle XML responses. ”) mà những người bảo trì mã trong tương lai sẽ hiểu3. 13 Nhập định dạngImports should be on separate lines; there are exceptions for 321 and 322 importsE. g 64Imports are always put at the top of the file, just after any module comments and docstrings and before module globals and constants. Nhập khẩu nên được nhóm từ chung chung nhất đến ít chung chung nhất
Trong mỗi nhóm, các mục nhập phải được sắp xếp theo từ điển, bỏ qua trường hợp, theo đường dẫn gói đầy đủ của mỗi mô-đun (_______3323 trong ____3324). Mã có thể tùy chọn đặt một dòng trống giữa các phần nhập 683. 14 Tuyên bốNói chung chỉ có một tuyên bố trên mỗi dòng However, you may put the result of a test on the same line as the test only if the entire statement fits on one line. Đặc biệt, bạn không bao giờ có thể làm như vậy với 63/ 64 vì cả 63 và 64 đều không thể nằm trên cùng một dòng và bạn chỉ có thể làm như vậy với 329 nếu không có 330 693. 15 Getters and SettersCác hàm getter và setter (còn được gọi là bộ truy cập và bộ biến đổi) nên được sử dụng khi chúng cung cấp vai trò hoặc hành vi có ý nghĩa để nhận hoặc đặt giá trị của biến Đặc biệt, chúng nên được sử dụng khi nhận hoặc thiết lập biến phức tạp hoặc chi phí đáng kể, hiện tại hoặc trong tương lai hợp lý Ví dụ: nếu một cặp getters/setters chỉ cần đọc và ghi một thuộc tính nội bộ, thì thuộc tính nội bộ sẽ được công khai thay thế. Để so sánh, nếu việc đặt một biến có nghĩa là một số trạng thái bị vô hiệu hóa hoặc được xây dựng lại, thì đó phải là một hàm setter. Lời gọi hàm gợi ý rằng một hoạt động có khả năng không tầm thường đang xảy ra. Ngoài ra, các thuộc tính có thể là một tùy chọn khi cần logic đơn giản hoặc tái cấu trúc để không còn cần getters và setters nữa Getters và setters phải tuân theo Nguyên tắc đặt tên, chẳng hạn như 331 và 332If the past behavior allowed access through a property, do not bind the new getter/setter functions to the property. Bất kỳ mã nào vẫn đang cố truy cập vào biến theo phương pháp cũ sẽ bị hỏng rõ ràng để chúng nhận thức được sự thay đổi về độ phức tạp 3. 16 đặt tên 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345Tên hàm, tên biến và tên tệp phải mang tính mô tả; . Đặc biệt, không sử dụng các từ viết tắt mơ hồ hoặc không quen thuộc với người đọc bên ngoài dự án của bạn và không viết tắt bằng cách xóa các chữ cái trong một từ Luôn sử dụng phần mở rộng tên tệp 267. Không bao giờ sử dụng dấu gạch ngang3. 16. 1 Tên cần tránh
3. 16. 2 Naming Conventions
3. 16. 3 Đặt tên tệpPython filenames must have a 267 extension and must not contain dashes ( 255). This allows them to be imported and unittested. If you want an executable to be accessible without the extension, use a symbolic link or a simple bash wrapper containing 3723. 16. 4 Nguyên tắc bắt nguồn từ Khuyến nghị của GuidoTypePublicInternalPackages 373Modules 373 375Classes 376 377Exceptions 376Functions 379 380Global/Class Constants 381 382Global/Class Variables 373 375Instance Variables 373 375 (protected)Method Names 379 380 (protected)Function/Method Parameters 373Local Variables 3733. 16. 5 Ký hiệu toán họcĐối với mã nặng về mặt toán học, các tên biến ngắn sẽ vi phạm hướng dẫn kiểu được ưu tiên hơn khi chúng khớp với ký hiệu đã thiết lập trong tài liệu tham khảo hoặc thuật toán. Khi làm như vậy, hãy tham khảo nguồn của tất cả các quy ước đặt tên trong một nhận xét hoặc chuỗi tài liệu hoặc, nếu nguồn không thể truy cập được, hãy ghi lại rõ ràng các quy ước đặt tên. Prefer PEP8-compliant 391 for public APIs, which are much more likely to be encountered out of context3. 17 MainTrong Python, 225 cũng như các bài kiểm tra đơn vị yêu cầu các mô-đun có thể nhập được. Nếu một tệp được dùng làm tệp thực thi, thì chức năng chính của nó phải ở hàm 393 và mã của bạn phải luôn kiểm tra 394 trước khi thực thi chương trình chính của bạn, để nó không được thực thi khi mô-đun được nhậpKhi sử dụng absl, hãy sử dụng 395 00Nếu không, hãy sử dụng 01Tất cả mã ở cấp cao nhất sẽ được thực thi khi mô-đun được nhập. Cẩn thận không gọi hàm, tạo đối tượng hoặc thực hiện các thao tác khác không nên thực hiện khi tệp đang được 225ed3. 18 Chiều dài chức năngThích các chức năng nhỏ và tập trung Chúng tôi nhận ra rằng các hàm dài đôi khi phù hợp, vì vậy không có giới hạn cứng nào được đặt cho độ dài của hàm. Nếu một hàm vượt quá khoảng 40 dòng, hãy nghĩ xem có thể chia nhỏ hàm đó mà không làm hại cấu trúc của chương trình hay không Ngay cả khi chức năng lâu dài của bạn hiện đang hoạt động hoàn hảo, ai đó sửa đổi nó sau vài tháng có thể thêm hành vi mới. Điều này có thể dẫn đến các lỗi khó tìm. Giữ chức năng của bạn ngắn gọn và đơn giản giúp người khác đọc và sửa đổi mã của bạn dễ dàng hơn Bạn có thể tìm thấy các hàm dài và phức tạp khi làm việc với một số mã. Đừng bị đe dọa bằng cách sửa đổi mã hiện có. nếu làm việc với một chức năng như vậy tỏ ra khó khăn, bạn thấy rằng các lỗi khó gỡ lỗi hoặc bạn muốn sử dụng một phần của nó trong nhiều ngữ cảnh khác nhau, hãy cân nhắc chia chức năng thành các phần nhỏ hơn và dễ quản lý hơn 3. 19 Chú thích loại3. 19. 1 Quy tắc chung
3. 19. Ngắt 2 dòngCố gắng tuân theo các quy tắc thụt đầu dòng hiện có Sau khi chú thích, nhiều chữ ký hàm sẽ trở thành “mỗi dòng một tham số”. Để đảm bảo kiểu trả về cũng được cung cấp dòng riêng, có thể đặt dấu phẩy sau tham số cuối cùng 03Luôn ưu tiên ngắt giữa các biến và không, ví dụ, giữa tên biến và chú thích loại. Tuy nhiên, nếu mọi thứ phù hợp trên cùng một dòng, hãy tiếp tục 04Nếu tổ hợp tên hàm, tham số cuối cùng và kiểu trả về quá dài, hãy thụt lề 4 trong một dòng mới. Khi sử dụng ngắt dòng, hãy ưu tiên đặt từng tham số và kiểu trả về trên các dòng riêng của chúng và căn chỉnh dấu ngoặc đơn đóng với 250 05Tùy chọn, kiểu trả về có thể được đặt trên cùng một dòng với tham số cuối cùng 06 18 cho phép bạn di chuyển dấu ngoặc đơn đóng sang một dòng mới và căn chỉnh với dòng mở đầu, nhưng điều này khó đọc hơn 07Như trong các ví dụ trên, không muốn ngắt các loại. Tuy nhiên, đôi khi chúng quá dài để nằm trên một dòng (cố gắng giữ cho các loại phụ không bị gián đoạn) 08Nếu một tên và loại quá dài, hãy cân nhắc sử dụng bí danh cho loại. Phương án cuối cùng là ngắt sau dấu hai chấm và thụt vào 4 09 103. 19. 3 Tuyên bố chuyển tiếpNếu bạn cần sử dụng một tên lớp (từ cùng một mô-đun) chưa được xác định – ví dụ: nếu bạn cần tên lớp bên trong phần khai báo của lớp đó hoặc nếu bạn sử dụng một lớp được xác định sau trong mã – 11 123. 19. 4 giá trị mặc địnhTheo PEP-008, chỉ sử dụng khoảng trắng xung quanh 251 cho các đối số có cả chú thích loại và giá trị mặc định 13 143. 19. 5 Không có LoạiTrong hệ thống kiểu Python, 406 là kiểu "hạng nhất" và vì mục đích đánh máy, 98 là bí danh của 406. Nếu một đối số có thể là 98, thì nó phải được khai báo. Bạn có thể sử dụng 410, nhưng nếu chỉ có một loại khác, hãy sử dụng 411Sử dụng 411 rõ ràng thay vì 411 ngầm định. Các phiên bản trước của PEP 484 cho phép 414 được hiểu là 415, nhưng đó không còn là hành vi ưa thích nữa 15 163. 19. 6 Type AliasesBạn có thể khai báo bí danh của các loại phức tạp. The name of an alias should be CapWorded. If the alias is used only in this module, it should be _Private For example, if the name of the module together with the name of the type is too long 17Other examples are complex nested types and multiple return variables from a function (as a tuple) 3. 19. 7 kiểu phớt lờYou can disable type checking on a line with the special comment 416 417 has a disable option for specific errors (similar to lint) 183. 19. 8 Typing VariablesAnnotated AssignmentsIf an internal variable has a type that is hard or impossible to infer, specify its type with an annotated assignment - use a colon and type between the variable name and value (the same as is done with function arguments that have a default value) 19Type CommentsThough you may see them remaining in the codebase (they were necessary before Python 3. 6), do not add any more uses of a 418 comment on the end of the line 003. 19. 9 Tuples vs Danh sáchTyped lists can only contain objects of a single type. Typed tuples can either have a single repeated type or a set number of elements with different types. The latter is commonly used as the return type from a function 013. 19. 10 TypeVarsThe Python type system has generics. The factory function 355 is a common way to use themExample 02A TypeVar can be constrained 03A common predefined type variable in the 321 module is 421. Use it for multiple annotations that can be 422 or 423 and must all be the same type 04A TypeVar must have a descriptive name, unless it meets all of the following criteria
05 063. 19. 11 String types
Use 423 for string/text data. For code that deals with binary data, use 422 07Nếu tất cả các kiểu chuỗi của một hàm luôn giống nhau, chẳng hạn nếu kiểu trả về giống với kiểu đối số trong đoạn mã trên, hãy sử dụng AnyStr 3. 19. 12 Imports For TypingĐối với các ký hiệu từ mô-đun 321 và 322 được sử dụng để hỗ trợ phân tích tĩnh và kiểm tra loại, hãy luôn nhập chính ký hiệu đó. Điều này giữ cho các chú thích phổ biến ngắn gọn hơn và phù hợp với các cách gõ được sử dụng trên khắp thế giới. You are explicitly allowed to import multiple specific classes on one line from the 321 and 322 modules. Bán tại 08Cho rằng cách nhập này sẽ thêm các mục vào không gian tên cục bộ, các tên trong 321 hoặc 322 phải được xử lý tương tự như các từ khóa và không được xác định trong mã Python của bạn, được nhập hay không. Nếu có xung đột giữa một loại và tên hiện có trong một mô-đun, hãy nhập nó bằng cách sử dụng 433 09Ưu tiên sử dụng các loại tích hợp làm chú thích nếu có. Python hỗ trợ các chú thích loại bằng cách sử dụng các loại vùng chứa tham số qua PEP-585, được giới thiệu trong Python 3. 9 10GHI CHÚ. Người dùng Apache Beam nên tiếp tục nhập vùng chứa tham số từ 321 113. 19. 13 Nhập khẩu có điều kiệnChỉ sử dụng nhập có điều kiện trong các trường hợp đặc biệt khi phải tránh nhập bổ sung cần thiết để kiểm tra loại trong thời gian chạy. Mô hình này không được khuyến khích; Các mục nhập chỉ cần thiết cho chú thích loại có thể được đặt trong khối 435
3. 19. 14 phụ thuộc tuần hoànCác phụ thuộc tròn gây ra bởi việc gõ là mã có mùi. Mã như vậy là một ứng cử viên tốt để tái cấu trúc. Mặc dù về mặt kỹ thuật, có thể giữ các phụ thuộc vòng tròn, nhưng các hệ thống xây dựng khác nhau sẽ không cho phép bạn làm như vậy vì mỗi mô-đun phải phụ thuộc vào mô-đun khác Thay thế các mô-đun tạo nhập khẩu phụ thuộc vòng tròn bằng 401. Đặt bí danh có tên có ý nghĩa và sử dụng tên loại thực từ mô-đun này (bất kỳ thuộc tính nào của Any là Any). Các định nghĩa bí danh phải được phân tách khỏi lần nhập cuối cùng bằng một dòng 133. 19. 15 thuốc gốcKhi chú thích, ưu tiên chỉ định tham số loại cho các loại chung; 14 15Nếu tham số loại tốt nhất cho một tên chung là 401, hãy làm cho nó rõ ràng, nhưng hãy nhớ rằng trong nhiều trường hợp, 355 có thể phù hợp hơn 16 174 Lời Chia TayHÃY KIÊN NHẪN Nếu bạn đang chỉnh sửa mã, hãy dành vài phút để xem mã xung quanh bạn và xác định phong cách của nó. Nếu họ sử dụng khoảng trắng xung quanh tất cả các toán tử số học của họ, thì bạn cũng nên. Nếu nhận xét của họ có các hộp dấu thăng nhỏ xung quanh, hãy làm cho nhận xét của bạn cũng có các hộp dấu thăng nhỏ xung quanh chúng Mục đích của việc có các hướng dẫn về phong cách là có một vốn từ vựng chung về viết mã để mọi người có thể tập trung vào những gì bạn đang nói hơn là vào cách bạn nói. Chúng tôi trình bày các quy tắc phong cách toàn cầu ở đây để mọi người biết từ vựng, nhưng phong cách địa phương cũng rất quan trọng. Nếu mã bạn thêm vào một tệp trông khác hẳn so với mã hiện có xung quanh nó, nó sẽ khiến người đọc mất nhịp khi họ đọc nó. Tránh điều này |