Định danh tích hợp python
Python là ngôn ngữ động chính được sử dụng tại 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
Để giúp bạn định dạng mã chính xác, chúng tôi đã tạo tệp cài đặt cho Vim. For Emacs, the default settings should be fine 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 DecisionMake sure you run 18 on your codeSuppress warnings if they are inappropriate so that other issues are not hidden. 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. ” is sufficient. 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 Decision
Ví dụ: mô-đun 47 có thể được nhập như sau 2Không sử dụng tên họ hàng trong nhập khẩu. Ngay cả khi mô-đun nằm trong cùng một gói, hãy sử dụng tên gói đầy đủ. 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 Định nghĩaExceptions 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 ConsCó thể khiến luồng điều khiển bị nhầm lẫn. Dễ bỏ sót các trường hợp lỗi khi gọi thư viện 2. 4. 4 Quyết địnhExceptions must follow certain conditions
2. 5 Mutable Global StateTránh trạng thái toàn cầu có thể thay đổi 2. 5. 1 DefinitionModule level values or class attributes that can get mutated during program execution 2. 5. 2 Ưu điểmOccasionally useful 2. 5. 3 Cons
2. 5. 4 Quyết địnhTránh trạng thái toàn cầu có thể thay đổi Trong những trường hợp hiếm hoi khi sử dụng trạng thái toàn cầu được đảm bảo, các thực thể toàn cầu có thể thay đổi phải được khai báo ở cấp độ mô-đun hoặc dưới dạng thuộc tính lớp và được tạo nội bộ bằng cách thêm một 28 vào tên. Nếu cần, quyền truy cập bên ngoài vào trạng thái toàn cầu có thể thay đổi phải được thực hiện thông qua các hàm công khai hoặc phương thức lớp. See Naming below. Vui lòng giải thích lý do thiết kế tại sao trạng thái chung có thể thay đổi đang được sử dụng trong nhận xét hoặc tài liệu được liên kết từ nhận xétModule-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 ProsAllows 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. Generator expressions can be very efficient, since they avoid the creation of a list entirely 2. 7. 3 ConsComplicated comprehensions or generator expressions can be hard to read 2. 7. 4 DecisionOkay to use for simple cases. Each portion must fit on one line. mapping expression, 78 clause, filter expression. Multiple 78 clauses or filter expressions are not permitted. Use loops instead when things get more complicated 0 12. 8 Default Iterators and OperatorsUse default iterators and operators for types that support them, like lists, dictionaries, and files 2. 8. 1 DefinitionContainer types, like dictionaries and lists, define default iterators and membership test operators (“in” and “not in”) 2. 8. 2 ProsThe default iterators and operators are simple and efficient. They express the operation directly, without extra method calls. A function that uses default operators is generic. It can be used with any type that supports the operation 2. 8. 3 ConsYou can’t tell the type of objects by reading the method names (unless the variable has type annotations). This is also an advantage 2. 8. 4 DecisionUse default iterators and operators for types that support them, like lists, dictionaries, and files. The built-in types define iterator methods, too. Prefer these methods to methods that return lists, except that you should not mutate a container while iterating over it 0 12. 9 GeneratorsUse generators as needed 2. 9. 1 DefinitionA generator function returns an iterator that yields a value each time it executes a yield statement. After it yields a value, the runtime state of the generator function is suspended until the next value is needed 2. 9. 2 ProsSimpler code, because the state of local variables and control flow are preserved for each call. A generator uses less memory than a function that creates an entire list of values at once 2. 9. 3 ConsLocal variables in the generator will not be garbage collected until the generator is either consumed to exhaustion or itself garbage collected 2. 9. 4 DecisionFine. Use “Yields. ” rather than “Returns. ” in the docstring for generator functions If the generator manages an expensive resource, make sure to force the clean up A good way to do the clean up is by wrapping the generator with a context manager PEP-0533 2. 10 Lambda FunctionsOkay for one-liners. Prefer generator expressions over 75 or 76 with a 772. 10. 1 DefinitionLambdas define anonymous functions in an expression, as opposed to a statement 2. 10. 2 ProsConvenient 2. 10. 3 ConsHarder to read and debug than local functions. The lack of names means stack traces are more difficult to understand. 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 DecisionOkay to use them for one-liners. 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 For common operations like multiplication, use the functions from the 83 module instead of lambda functions. Ví dụ: thích 84 hơn là 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 DefinitionConditional expressions (sometimes called a “ternary operator”) are mechanisms that provide a shorter syntax for if statements. For example. 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ểmMay be harder to read than an if statement. The condition may be difficult to locate if the expression is long 2. 11. 4 Quyết địnhĐược rồi để sử dụng cho các trường hợp đơn giản. Each portion must fit on one line. true-expression, if-expression, else-expression. Use a complete if statement when things get more complicated 2 32. 12 Default Argument ValuesOkay in most cases 2. 12. 1 DefinitionYou can specify values for variables at the end of a function’s parameter list, e. g. , 87. If 88 is called with only one argument, 89 is set to 0. If it is called with two arguments, 89 has the value of the second argument2. 12. 2 ProsOften you have a function that uses lots of default values, but on rare occasions you want to override the defaults. Default argument values provide an easy way to do this, without having to define lots of functions for the rare exceptions. As Python does not support overloaded methods/functions, default arguments are an easy way of “faking” the overloading behavior 2. 12. 3 ConsDefault arguments are evaluated once at module load time. This may cause problems if the argument is a mutable object such as a list or a dictionary. If the function modifies the object (e. g. , by appending an item to a list), the default value is modified 2. 12. 4 Quyết địnhOkay to use with the following caveat Do not use mutable objects as default values in the function or method definition 4 52. 13 PropertiesProperties may be used to control getting or setting attributes that require trivial computations or logic. Property implementations must match the general expectations of regular attribute access. that they are cheap, straightforward, and unsurprising 2. 13. 1 DefinitionA way to wrap method calls for getting and setting an attribute as a standard attribute access 2. 13. 2 Pros
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 rather than 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. Variable bindings are resolved using lexical scoping, that is, based on the static program text. 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 An example of the use of this feature is 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 ConsCó 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 9Vì vậy, 217 sẽ in ra 218, không phải 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 phápSử 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. ), vì chúng có thể không khả dụng khi trình trang trí chạy (tại thời điểm nhập, có thể từ 225 hoặc các công cụ khác). 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ợpTrình trang trí là trường hợp đặc biệt của “mã cấp cao nhất” - xem phần chính để thảo luận thêm Không bao giờ sử dụng 220 trừ khi bị buộc phải tích hợp với API được xác định trong thư viện hiện có. Thay vào đó hãy viết một hàm cấp mô-đunChỉ sử dụng 221 khi viết một hàm tạo có tên hoặc một quy trình dành riêng cho lớp để sửa đổi trạng thái chung cần thiết, chẳng hạn như bộ đệm trên toàn quy trình2. 18 luồngKhô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 con trăn hiện đại. 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. Once you no longer need to run on a version where the features are hidden behind a 239 import, feel free to remove those linesTrong 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. Ngay cả khi bạn hiện không sử dụng tính năng mà một tính năng nhập cụ thể trong tương lai cho phép trong mã của bạn hôm nay, thì việc giữ nguyên tính năng này trong tệp sẽ ngăn việc vô tình sửa đổi mã sau này tùy thuộc vào hành vi cũ hơn 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 Type Annotated CodeBạ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. Use pyi files for third-party or extension modules 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 ProsType annotations improve the readability and maintainability of your code. The type checker will convert many runtime errors to build-time errors, and reduce your ability to use Power Features 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 DecisionBạ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. In those situations, authors are encouraged to add a comment with a TODO or link to a bug describing the issue(s) currently preventing type annotation adoption in the BUILD file or in the code itself as appropriate 3 Python Style Rules3. 1 SemicolonsKhô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ự Explicit exceptions to the 80 character limit
Do not use backslash line continuation except for 242 statements requiring three or more context managersSử dụng cách nối dòng ẩn của Python bên trong dấu ngoặc đơn, dấu ngoặc và dấu ngoặc nhọn. Nếu cần, bạn có thể thêm một cặp dấu ngoặc đơn xung quanh một biểu thức 24When a literal string won’t fit on a single line, use parentheses for implicit line joining 25Trong các nhận xét, hãy đặt các URL dài trên dòng riêng của chúng nếu cần 26 27Được phép sử dụng tiếp tục dấu gạch chéo ngược khi xác định câu lệnh 242 với ba trình quản lý bối cảnh trở lên. Đối với hai trình quản lý bối cảnh, hãy sử dụng câu lệnh 242 lồng nhau 28 29 30Make note of the indentation of the elements in the line continuation examples above; see the indentation section for explanation Trong tất cả các trường hợp khác khi một dòng vượt quá 80 ký tự và trình định dạng tự động yapf không giúp đưa dòng xuống dưới giới hạn, thì dòng đó được phép vượt quá mức tối đa này. Authors are encouraged to manually break the line up per the notes above when it is sensible 3. 3 ParenthesesSử dụng dấu ngoặc đơn một cách tiết kiệm Nó là tốt, mặc dù không bắt buộc, để sử dụng dấu ngoặc đơn xung quanh bộ dữ liệu. 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 Never use tabs. Việc tiếp tục dòng ngụ ý phải căn chỉnh các phần tử được bao theo chiều dọc (xem ví dụ về độ dài dòng) hoặc sử dụng thụt lề 4 khoảng trắng treo. 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. The presence of a trailing comma is also used as a hint to our Python code auto-formatter YAPF to direct it to auto-format the container of items to one item per line when the 248 after the final element is present 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. One blank line between method definitions and between the docstring of a 249 and the first method. No blank line following a 250 line. Use single blank lines as you judge appropriate within functions or methodsCác dòng trống không cần phải được neo vào định nghĩa. For example, related comments immediately preceding function, class, and method definitions can make sense. 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 WhitespaceThự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 37No whitespace before a comma, semicolon, or colon. 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 39No whitespace before the open paren/bracket that starts an argument list, indexing or slicing 40 41No trailing whitespace Surround binary operators with a single space on either side for assignment ( 251), comparisons ( 252), and 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 43Không sử dụng khoảng trắng để sắp xếp theo chiều dọc các mã thông báo trên các dòng liên tiếp, vì nó sẽ trở thành gánh nặng bảo trì (áp dụng cho 264, 265, 251, v.v. ) 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. Start the main file of a program with 269 (to support virtualenvs) or 270 per PEP-394This line is used by the kernel to find the Python interpreter, but is ignored by Python when importing modules. It is only necessary on a file intended to be executed directly Đả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 DocstringsPython uses docstrings to document code. 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. These strings can be extracted automatically through the 271 member of the object and are used by 225. (Try running 225 on your module to see how it looks. ) 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). A docstring should be organized as a summary line (one physical line not exceeding 80 characters) terminated by a period, question mark, or exclamation point. 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. There are more formatting guidelines for docstrings below3. 8. 2 mô-đunEvery file should contain license boilerplate. Choose the appropriate boilerplate for the license used by the project (for example, 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 Functions and MethodsTrong 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 A docstring is mandatory for every function that has one or more of the following properties
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ó. Otherwise, subtle but important details of a function’s implementation that are not relevant to the caller are better expressed as comments alongside the code than within the function’s docstring 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. The rationale is that there is no need to repeat in many places documentation that is already present in the base method’s docstring. However, if the overriding method’s behavior is substantially different from the overridden method, or details need to be provided (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 đèCertain aspects of a function should be documented in special sections, listed below. 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. A description should follow the name, and be separated by a colon followed by either a space or newline. If the description is too long to fit on a single 80-character line, use a hanging indent of 2 or 4 spaces more than the parameter name (be consistent with the rest of the docstrings in the file). 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. (or Yields. cho trình tạo) Mô tả loại và ngữ nghĩa của giá trị trả về. If the function only returns None, this section is not required. 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ề. Do not imitate ‘NumPy style’ (example), which frequently documents a tuple return value as if it were multiple return values with individual names (never mentioning the tuple). Thay vào đó, hãy mô tả một giá trị trả về như. “Trả về. A tuple (mat_a, mat_b), where mat_a is …, and …”. The auxiliary names in the docstring need not necessarily correspond to any internal names used in the function body (as those are not part of the 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. You should not document exceptions that get raised if the API specified in the docstring is violated (because this would paradoxically make behavior under violation of the API part of the 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 Block and Inline CommentsNơ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ờ. Các hoạt động phức tạp nhận được một vài dòng nhận xét trước khi các hoạt động bắt đầu. 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 itselfOn the other hand, never describe the code. Giả sử người đọc mã biết Python (mặc dù không phải thứ bạn đang cố gắng làm) tốt hơn bạn 743. 8. 6 Punctuation, Spelling, and GrammarChú ý đến dấu câu, chính tả và ngữ pháp; Comments should be as readable as narrative text, with proper capitalization and punctuation. Trong nhiều trường hợp, các câu hoàn chỉnh dễ đọc hơn các đoạn câu. 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 StringsSử 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. Use your best judgment to decide between string formatting options. 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 76Avoid using the 254 and 296 operators to accumulate a string within a loop. In some conditions, accumulating a string with addition can lead to quadratic rather than linear running time. Mặc dù các tích lũy phổ biến thuộc loại này có thể được tối ưu hóa trên CPython, nhưng đó là chi tiết triển khai. 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. Instead, add each substring to a list and 297 the list after the loop terminates, or write each substring to an 298 buffer. These techniques consistently have amortized-linear run time complexity 77 78Be consistent with your choice of string quote character within a file. Pick 299 or 300 and stick with it. Bạn có thể sử dụng ký tự trích dẫn khác trên một chuỗi để tránh phải ký tự trích dẫn thoát dấu gạch chéo ngược trong chuỗi 79 50Thích 274 cho chuỗi nhiều dòng hơn là 302. Các dự án có thể chọn sử dụng 302 cho tất cả các chuỗi nhiều dòng không phải chuỗi doc nếu và chỉ khi chúng cũng sử dụng 299 cho các chuỗi thông thường. Docstrings must use 274 regardlessMulti-line strings do not flow with the indentation of the rest of the program. 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ýFor logging functions that expect a pattern-string (with %-placeholders) as their first argument. Always call them with a string literal (not an f-string. ) làm đối số đầu tiên của chúng với tham số mẫu làm đối số tiếp theo. 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. It also prevents spending time rendering a message that no logger is configured to output 56 57 583. 10. 2 Error MessagesThông báo lỗi (chẳng hạn như. message strings on exceptions like 54, or messages shown to the user) should follow three guidelines
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 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 Để các tệp, ổ cắm hoặc các đối tượng trạng thái khác mở một cách không cần thiết có nhiều nhược điểm
Furthermore, while files and sockets (and some similarly behaving resources) are automatically closed when the object is destructed, coupling the lifetime of the object to the state of the resource is poor practice
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 Sử dụng nhận xét 312 cho mã tạm thời, giải pháp ngắn hạn hoặc đủ tốt nhưng không hoàn hảoA 312 comment begins with the word 312 in all caps, and a parenthesized context identifier. Ideally a bug reference, sometimes a username. 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 ngữ 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ố. Thus when you create a 312 with a username, it is almost always your own username that is given 63Nếu 312 của bạn ở dạng “Vào một ngày trong tương lai, hãy làm điều gì đó”, hãy đảm bảo rằng bạn bao gồm một ngày rất cụ thể (“Khắc phục trước tháng 11 năm 2009”) hoặc một sự kiện rất cụ thể (“Xóa mã này khi tất cả khách hàng có thể xử lý phản hồi XML. ”) mà những người bảo trì mã trong tương lai sẽ hiểu3. 13 Nhập định dạngNhập khẩu nên được trên các dòng riêng biệt; E. 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 thứ tự 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 StatementsNói chung chỉ có một tuyên bố trên mỗi dòng Tuy nhiên, bạn chỉ có thể đặt kết quả của một bài kiểm tra trên cùng một dòng với bài kiểm tra nếu toàn bộ câu lệnh nằm trên một dòng. In particular, you can never do so with 63/ 64 since the 63 and 64 can’t both fit on the same line, and you can only do so with an 329 if there is no 330 693. 15 Getters and SettersGetter and setter functions (also called accessors and mutators) should be used when they provide a meaningful role or behavior for getting or setting a variable’s value In particular, they should be used when getting or setting the variable is complex or the cost is significant, either currently or in a reasonable future If, for example, a pair of getters/setters simply read and write an internal attribute, the internal attribute should be made public instead. Để 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. The function invocation hints that a potentially non-trivial operation is occurring. 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 and setters should follow the Naming guidelines, such as 331 and 332Nếu hành vi trong quá khứ cho phép truy cập thông qua một thuộc tính, không liên kết các hàm getter/setter mới với thuộc tính. 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 Quy ước đặt tên
3. 16. 3 Đặt tên tệpTên tệp Python phải có phần mở rộng là 267 và không được chứa dấu gạch ngang ( 255). Điều này cho phép chúng được nhập và kiểm tra. If you want an executable to be accessible without the extension, use a symbolic link or a simple bash wrapper containing 3723. 16. 4 Guidelines derived from Guido’s RecommendationsTypePublicInternalPackages 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. Ưu tiên 391 tuân thủ PEP8 cho các API công khai, có nhiều khả năng gặp phải ngoài ngữ cảnh hơn3. 17 chínhIn Python, 225 as well as unit tests require modules to be importable. If a file is meant to be used as an executable, its main functionality should be in a 393 function, and your code should always check 394 before executing your main program, so that it is not executed when the module is importedKhi sử dụng absl, hãy sử dụng 395 00Otherwise, use 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 Function lengthThí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. Keeping your functions short and simple makes it easier for other people to read and modify your code 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ã. Do not be intimidated by modifying existing code. if working with such a function proves to be difficult, you find that errors are hard to debug, or you want to use a piece of it in several different contexts, consider breaking up the function into smaller and more manageable pieces 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. However, if everything fits on the same line, go for it 04If the combination of the function name, the last parameter, and the return type is too long, indent by 4 in a new line. 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) 08If a single name and type is too long, consider using an alias for the type. 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 Forward DeclarationsNế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 Default ValuesAs per PEP-008, use spaces around the 251 only for arguments that have both a type annotation and a default value 13 143. 19. 5 NoneTypeIn the Python type system, 406 is a “first class” type, and for typing purposes, 98 is an alias for 406. Nếu một đối số có thể là 98, thì nó phải được khai báo. You can use 410, but if there is only one other type, use 411Use explicit 411 instead of implicit 411. Earlier versions of PEP 484 allowed 414 to be interpreted as 415, but that is no longer the preferred behavior 15 163. 19. 6 bí danh loạiBạn có thể khai báo bí danh của các loại phức tạp. Tên của bí danh phải là CapWorded. Nếu bí danh chỉ được sử dụng trong mô-đun này, thì bí danh đó phải là _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 Ignoring TypesYou can disable type checking on a line with the special comment 416 417 có tùy chọn tắt đối với các lỗi cụ thể (tương tự như 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) 19Nhập CommentsMặc dù bạn có thể thấy chúng còn lại trong cơ sở mã (chúng cần thiết trước Python 3. 6), không thêm bất kỳ cách sử dụng nào nữa của nhận xét 418 ở cuối dòng 003. 19. 9 Tuples vs ListsDanh sách đã nhập chỉ có thể chứa các đối tượng thuộc một loại. 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 LoạiVarsThe 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
Sử dụng 423 cho dữ liệu chuỗi/văn bản. For code that deals with binary data, use 422 07If all the string types of a function are always the same, for example if the return type is the same as the argument type in the code above, use AnyStr 3. 19. 12 Nhập khẩu để gõĐố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 đó. This keeps common annotations more concise and matches typing practices used around the world. Bạn rõ ràng được phép nhập nhiều lớp cụ thể trên một dòng từ mô-đun 321 và 322. Bán tại 08Given that this way of importing adds items to the local namespace, names in 321 or 322 should be treated similarly to keywords, and not be defined in your Python code, typed or not. Nếu có sự xung đột giữa một loại và một 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Ú. Users of Apache Beam should continue to import parametric containers from 321 113. 19. 13 Conditional ImportsChỉ 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; Imports that are needed only for type annotations can be placed within an 435 block
3. 19. 14 Circular DependenciesCircular dependencies that are caused by typing are code smells. Such code is a good candidate for refactoring. Although technically it is possible to keep circular dependencies, various build systems will not let you do so because each module has to depend on the other Replace modules that create circular dependency imports with 401. Set an alias with a meaningful name, and use the real type name from this module (any attribute of Any is Any). Alias definitions should be separated from the last import by one line 133. 19. 15 thuốc gốcWhen annotating, prefer to specify type parameters for generic types; otherwise, the generics’ parameters will be assumed to be 401 14 15If the best type parameter for a generic is 401, make it explicit, but remember that in many cases 355 might be more appropriate 16 174 Parting WordsHÃ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 |