Hướng dẫn google python style guide vs pep8 - hướng dẫn kiểu google python vs pep8

  1. Đáng chú ý nhất là họ sử dụng hai không gian để thụt vào thay vì 4.
  2. Kiểu Camelcase cho các chức năng và phương pháp thay vì kiểu Camel_case.

Show

Đã hỏi ngày 10 tháng 3 năm 2020 lúc 23:31Mar 10, 2020 at 23:31

Hướng dẫn google python style guide vs pep8 - hướng dẫn kiểu google python vs pep8

1

Sự khác biệt chính là phong cách Google Python đi kèm với nhiều chi tiết hơn về cách viết mã, ví dụ như cách viết tài liệu của bạn hoặc khi nào nên sử dụng bí danh cho một biến, điều này không được chỉ định trong PEP8

Đã trả lời ngày 10 tháng 3 năm 2020 lúc 23:43Mar 10, 2020 at 23:43

Hướng dẫn google python style guide vs pep8 - hướng dẫn kiểu google python vs pep8

Hướng dẫn theo phong cách Google Python

Mục lục
  • 1. Bối cảnh
  • 2 Quy tắc ngôn ngữ Python
    • 2.1 Lint
    • 2.2 Nhập khẩu
    • 2.3 gói
    • 2.4 ngoại lệ
    • 2.5 Biến toàn cầu
    • 2.6 Các lớp và chức năng Nested/Local/Inside
    • 2.7 Biểu thức toàn diện & trình tạo
    • 2.8 Máy lặp và toán tử mặc định
    • 2.9 Máy phát điện
    • 2.10 Chức năng Lambda
    • 2.11 Biểu thức có điều kiện
    • 2.12 Giá trị đối số mặc định
    • 2.13 Thuộc tính
    • 2.14 Đánh giá đúng/sai
    • 2.16 Phạm vi từ vựng
    • 2.17 Chức năng và phương pháp trang trí
    • 2.18 Xán
    • 2.19 Các tính năng năng lượng
    • 2.20 Python hiện đại: từ __future__ nhập khẩu
    • 2.21 Loại mã chú thích
  • 3 quy tắc phong cách Python
    • 3.1 Bán kết
    • 3.2 Chiều dài đường
    • 3,3 ngoặc đơn
    • 3.4 thụt
      • 3.4.1 Dấu phẩy theo trình tự các mặt hàng?
    • 3.5 dòng trống
    • 3.6 Whitespace
    • 3.7 Dòng Shebang
    • 3.8 Nhận xét và tài liệu
      • 3.8.1 Docstrings
      • 3.8.2 Mô -đun
      • 3.8.3 Chức năng và phương pháp
      • 3.8.4 Lớp học
      • 3.8.5 bình luận khối và nội tuyến
      • 3.8.6 Dấu câu, Chính tả và Ngữ pháp
    • 3.10 Chuỗi
      • 3.10.1 Ghi nhật ký
      • 3.10.2 Thông báo lỗi
    • 3.11 Tệp, ổ cắm và tài nguyên trạng thái tương tự
    • 3.12 Bình luận TODO
    • 3.13 Định dạng nhập khẩu
    • 3.14 Báo cáo
    • 3.15 Trình truy cập
    • 3.16 Đặt tên
      • 3.16.1 Tên để tránh
      • 3.16.2 quy ước đặt tên
      • 3.16.3 Đặt tên tệp
      • 3.16.4 Hướng dẫn có nguồn gốc từ các khuyến nghị của Guido
    • 3.17 Chính
    • 3.18 Chiều dài chức năng
    • 3.19 Loại chú thích
      • 3.19.1 Quy tắc chung
      • 3.19.2 Phá vỡ dòng
      • 3.19.3 Khai báo chuyển tiếp
      • 3.19.4 Giá trị mặc định
      • 3.19.5 Nonetype
      • 3.19.6 Bí danh loại
      • 3.19.7 Bỏ qua các loại
      • 3.19.8 Biến gõ
      • 3.19.9 Tuples vs Danh sách
      • 3.19.10 Typevars
      • 3.19.11 Các loại chuỗi
      • 3.19.12 Nhập khẩu để gõ
      • 3.19.13 Nhập khẩu có điều kiện
      • 3.19.14 Phụ thuộc tròn
      • 3.19.15 Generics
      • 3.19.16 phụ thuộc xây dựng
  • 4 từ chia tay

1. Bối cảnh

2 Quy tắc ngôn ngữ Python

2.1 Lint

2.2 Nhập khẩu

2 Quy tắc ngôn ngữ Python

2.1 Lint

2.2 Nhập khẩu

2.3 gói

2.4 ngoại lệ

2.5 Biến toàn cầu

2.6 Các lớp và chức năng Nested/Local/Inside

2.7 Biểu thức toàn diện & trình tạo

2.8 Máy lặp và toán tử mặc định

2.9 Máy phát điện

2.10 Chức năng Lambda

2.11 Biểu thức có điều kiện

dict = 'something awful'  # Bad Idea... pylint: disable=redefined-builtin

Các cảnh báo

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
16 được xác định theo tên biểu tượng (
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
21) Các cảnh báo cụ thể của Google bắt đầu với
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
22.

Nếu lý do cho sự đàn áp không rõ ràng từ tên biểu tượng, hãy thêm một lời giải thích.

Ức chế theo cách này có lợi thế là chúng ta có thể dễ dàng tìm kiếm các sự đàn áp và xem lại chúng.

Bạn có thể nhận được một danh sách các cảnh báo

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
16 bằng cách thực hiện:

Để có thêm thông tin về một thông báo cụ thể, hãy sử dụng:

Thích

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
24 hơn mẫu cũ không dùng nữa
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
25.

Các cảnh báo đối số không sử dụng có thể bị triệt tiêu bằng cách xóa các biến ở đầu hàm. Luôn bao gồm một bình luận giải thích lý do tại sao bạn đang xóa nó. "Không được sử dụng." là đủ. Ví dụ:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam

Các hình thức phổ biến khác của việc đàn áp cảnh báo này bao gồm sử dụng ‘

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
26, làm người định danh cho đối số không sử dụng hoặc tiền tố tên đối số với‘
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
27, hoặc gán chúng cho ‘
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
26. Những hình thức này được cho phép nhưng không còn được khuyến khích. Những người gọi phá vỡ này vượt qua các đối số theo tên và không thực thi rằng các đối số thực sự không được sử dụng.

2.2 Nhập khẩu

Chỉ sử dụng các câu lệnh

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
29 cho các gói và mô -đun, không phải cho các lớp hoặc chức năng riêng lẻ.

2.2.1 Định nghĩa

Cơ chế tái sử dụng để chia sẻ mã từ mô -đun này sang mô -đun khác.

2.2.2 Ưu điểm

Hội nghị quản lý không gian tên là đơn giản. Nguồn của mỗi định danh được chỉ định một cách nhất quán;

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
30 nói rằng đối tượng
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
31 được xác định trong mô -đun
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
32.

2.2.3 nhược điểm

Tên mô -đun vẫn có thể va chạm. Một số tên mô -đun dài bất tiện.

2.2.4 Quyết định

  • Sử dụng
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    33 để nhập các gói và mô -đun.
  • Sử dụng
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    34 trong đó
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    32 là tiền tố gói và
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    36 là tên mô -đun không có tiền tố.
  • Sử dụng
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    37 Nếu hai mô-đun có tên
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    36 sẽ được nhập, nếu
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    36 xung đột với tên cấp cao nhất được xác định trong mô-đun hiện tại hoặc nếu
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    36 là một tên dài bất tiện.
  • Chỉ sử dụng
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    41 khi
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    42 là viết tắt tiêu chuẩn (ví dụ:
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    43 cho
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    44).

Ví dụ: mô -đun

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
45 có thể được nhập như sau:

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)

Không sử dụng tên tương đối 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 đủ. Điều này giúp ngăn chặn việc nhập một gói hai lần.

2.2.4.1 miễn trừ

Miễn trừ từ quy tắc này:

  • Các ký hiệu từ các mô -đun sau được sử dụng để hỗ trợ phân tích tĩnh và kiểm tra loại:
    • def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
          del beans, eggs  # Unused by vikings.
          return spam + spam + spam
      
      46 Mô -đun
    • def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
          del beans, eggs  # Unused by vikings.
          return spam + spam + spam
      
      47 Mô -đun
    • def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
          del beans, eggs  # Unused by vikings.
          return spam + spam + spam
      
      48 Mô -đun
  • Chuyển hướng từ mô -đun Six.Move.

2.3 gói

Nhập mỗi mô -đun bằng cách sử dụng vị trí tên đường dẫn đầy đủ của mô -đun.

2.3.1 Ưu điểm

Tránh xung đột trong tên mô -đun hoặc nhập khẩu không chính xác do đường dẫn tìm kiếm mô -đun không phải là những gì tác giả mong đợi. Làm cho nó dễ dàng hơn để tìm các mô -đun.

2.3.2 Nhược điểm

Làm cho khó khăn hơn để triển khai mã vì bạn phải sao chép hệ thống phân cấp gói. Không thực sự là một vấn đề với các cơ chế triển khai hiện đại.

2.3.3 Quyết định

Tất cả mã mới sẽ nhập từng mô -đun bằng tên gói đầy đủ của nó.

Nhập khẩu phải như sau:

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)

(Giả sử tập tin này sống ở

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
49 trong đó
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
50 cũng tồn tại)

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie

Thư mục nhị phân chính được đặt trong không nên được giả định là trong

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
51 mặc dù điều đó xảy ra trong một số môi trường. Đây là trường hợp, mã nên giả định rằng
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
52 đề cập đến gói thứ ba hoặc gói cấp cao nhất có tên
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
53, không phải là
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
50 cục bộ.

2.4 ngoại lệ

Các trường hợp ngoại lệ được cho phép nhưng phải được sử dụng cẩn thận.

2.4.1 Định nghĩa

Ngoại lệ là một phương tiện để thoát ra khỏi luồng kiểm soát bình thường để xử lý các lỗi hoặc các điều kiện đặc biệt khác.

2.4.2 Ưu điểm

Dòng điều khiển của mã hoạt động bình thường không bị lộn xộn bởi mã xử lý lỗi. Nó cũng cho phép luồng điều khiển bỏ qua nhiều khung hình khi một điều kiện nhất định xảy ra, ví dụ: trả lại từ các hàm N được lồng trong một bước thay vì phải thông qua các lỗi lỗi.

2.4.3 nhược điểm

Có thể làm cho dòng điều khiển bị nhầm lẫn. Dễ dàng bỏ lỡ các trường hợp lỗi khi thực hiện cuộc gọi thư viện.

2.4.4 Quyết định

Ngoại lệ phải tuân theo các điều kiện nhất định:

  • Sử dụng các lớp ngoại lệ tích hợp khi nó có ý nghĩa. Ví dụ: nâng

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    55 để chỉ ra một lỗi lập trình như tiền điều kiện bị vi phạm (chẳng hạn như nếu bạn được thông qua một số âm nhưng yêu cầu một số dương). Không sử dụng các câu lệnh
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    56 để xác thực các giá trị đối số của API công khai.
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    56 được sử dụng để đảm bảo tính chính xác bên trong, không thực thi việc sử dụng chính xác cũng như không chỉ ra rằng một số sự kiện bất ngờ đã xảy ra. Nếu một ngoại lệ được mong muốn trong các trường hợp sau, hãy sử dụng một tuyên bố nâng cao. Ví dụ:

    Yes:
      def connect_to_next_port(self, minimum: int) -> int:
        """Connects to the next available port.
    
        Args:
          minimum: A port value greater or equal to 1024.
    
        Returns:
          The new minimum port.
    
        Raises:
          ConnectionError: If no available port is found.
        """
        if minimum < 1024:
          # Note that this raising of ValueError is not mentioned in the doc
          # string's "Raises:" section because it is not appropriate to
          # guarantee this specific behavioral reaction to API misuse.
          raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
        port = self._find_next_open_port(minimum)
        if port is None:
          raise ConnectionError(
              f'Could not connect to service on port {minimum} or higher.')
        assert port >= minimum, (
            f'Unexpected port {port} when minimum was {minimum}.')
        return port
    

    No:
      def connect_to_next_port(self, minimum: int) -> int:
        """Connects to the next available port.
    
        Args:
          minimum: A port value greater or equal to 1024.
    
        Returns:
          The new minimum port.
        """
        assert minimum >= 1024, 'Minimum port must be at least 1024.'
        port = self._find_next_open_port(minimum)
        assert port is not None
        return port
    

  • Thư viện hoặc gói có thể xác định ngoại lệ của riêng họ. Khi làm như vậy, họ phải thừa hưởng từ một lớp ngoại lệ hiện có. Tên ngoại lệ nên kết thúc trong

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    58 và không nên giới thiệu sự lặp lại (
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    59).

  • Không bao giờ sử dụng các câu lệnh Catch-all

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    60 hoặc bắt
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    61 hoặc
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    62, trừ khi bạn là

    • tái tạo lại ngoại lệ, hoặc
    • Tạo một điểm cô lập trong chương trình nơi các trường hợp ngoại lệ không được truyền bá nhưng thay vào đó được ghi lại và triệt tiêu, chẳng hạn như bảo vệ một luồng khỏi bị sập bằng cách bảo vệ khối ngoài cùng của nó.

    Python rất khoan dung về vấn đề này và

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    60 sẽ thực sự bắt được mọi thứ bao gồm tên sai chính tả, các cuộc gọi sys.exit (), ngắt Ctrl+C, thất bại nhất quán và tất cả các loại ngoại lệ khác mà bạn chỉ đơn giản là không muốn bắt.

  • Giảm thiểu số lượng mã trong khối ________ 164/________ 165. Cơ thể của

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    64 càng lớn, càng có nhiều ngoại lệ sẽ được nêu ra bởi một dòng mã mà bạn đã không mong đợi để nêu ra một ngoại lệ. Trong những trường hợp đó, khối ________ 164/________ 165 ẩn một lỗi thực sự.

  • Sử dụng mệnh đề

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    69 để thực thi mã cho dù ngoại lệ có được nêu trong khối
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    64 hay không. Điều này thường hữu ích cho việc dọn dẹp, tức là đóng một tệp.

2.5 Biến toàn cầu

Tránh các biến toàn cầu.

2.5.1 Định nghĩa

Các biến được khai báo ở cấp độ mô -đun hoặc là thuộc tính lớp.

2.5.2 Ưu điểm

Đôi khi hữu ích.

2.5.3 nhược điểm

Có khả năng thay đổi hành vi mô -đun trong quá trình nhập, bởi vì các bài tập cho các biến toàn cầu được thực hiện khi mô -đun được nhập lần đầu tiên.

2.5.4 Quyết định

Tránh các biến toàn cầu.

2.5.1 Định nghĩa

Các biến được khai báo ở cấp độ mô -đun hoặc là thuộc tính lớp.

2.5.2 Ưu điểm

Đôi khi hữu ích.

2.5.3 nhược điểm

Có khả năng thay đổi hành vi mô -đun trong quá trình nhập, bởi vì các bài tập cho các biến toàn cầu được thực hiện khi mô -đun được nhập lần đầu tiên.

2.5.4 Quyết định

Nếu cần, các biến toàn cầu nên được khai báo ở cấp độ mô -đun và được thực hiện nội bộ cho mô -đun bằng cách chi tiêu

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
26 cho tên. Truy cập bên ngoài vào các biến toàn cầu phải được thực hiện thông qua các chức năng cấp mô-đun công khai. Xem đặt tên bên dưới.

Trong khi các hằng số cấp mô-đun là các biến số về mặt kỹ thuật, chúng được phép và khuyến khích. Ví dụ:
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
72. Các hằng số phải được đặt tên bằng cách sử dụng tất cả các mũ có dấu gạch dưới. Xem đặt tên bên dưới.

2.6 Các lớp và chức năng Nested/Local/Inside

Các chức năng hoặc lớp cục bộ lồng nhau là tốt khi được sử dụng để đóng qua một biến cục bộ. Các lớp học bên trong là tốt.

2.6.1 Định nghĩa

Một lớp có thể được xác định bên trong một phương thức, hàm hoặc lớp. Một hàm có thể được xác định bên trong một phương thức hoặc hàm. Các chức năng lồng nhau có quyền truy cập chỉ đọc vào các biến được xác định trong phạm vi kèm theo.

2.6.2 Ưu điểm

Cho phép định nghĩa các lớp và chức năng tiện ích chỉ được sử dụng bên trong phạm vi rất hạn chế. Rất adt-y. Thường được sử dụng để thực hiện trang trí.

2.6.3 Nhược điểm

Các chức năng và các lớp lồng nhau không thể được kiểm tra trực tiếp. Nesting có thể làm cho chức năng bên ngoài dài hơn và không thể đọc được.

2.6.4 Quyết định

Họ ổn với một số cảnh báo. Tránh các hàm hoặc lớp lồng nhau trừ khi đóng qua giá trị cục bộ khác với
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
73 hoặc
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
74. Không tổ chức năng chỉ để ẩn nó khỏi người dùng của một mô -đun. Thay vào đó, tiền tố tên của nó với một _ ở cấp độ mô -đun để nó vẫn có thể được truy cập bằng các bài kiểm tra.

2.7 Biểu thức toàn diện & trình tạo

Được rồi để sử dụng cho các trường hợp đơn giản.

2.7.1 Định nghĩa

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)

Danh sách, Dict và đặt toàn bộ cũng như các biểu thức của máy phát cung cấp một cách ngắn gọn và hiệu quả để tạo các loại container và trình lặp mà không cần dùng đến việc sử dụng các vòng lặp truyền thống, def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str: del beans, eggs # Unused by vikings. return spam + spam + spam 75, def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str: del beans, eggs # Unused by vikings. return spam + spam + spam 76 hoặc def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str: del beans, eggs # Unused by vikings. return spam + spam + spam 77.

2.7.2 Ưu điểm

Các toàn bộ đơn giản có thể rõ ràng và đơn giản hơn so với các Danh sách, danh sách hoặc thiết lập các kỹ thuật sáng tạo khác. Biểu thức của máy phát có thể rất hiệu quả, vì chúng tránh được việc tạo ra một danh sách hoàn toàn.

2.7.3 Nhược điểm

Chuỗi hiểu phức tạp hoặc biểu thức máy phát có thể khó đọc.

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 phù hợp với một dòng: Biểu thức ánh xạ, mệnh đề
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
78, Biểu thức bộ lọc. Không được phép cho phép các mệnh đề
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
78 hoặc biểu thức lọc. Sử dụng các vòng thay vì mọi thứ trở nên phức tạp hơn.

2.8 Máy lặp và toán tử mặc định

2.8.4 Quyết định

Sử dụng trình lặp mặc định và toán tử 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 xác định các phương thức lặp lại. Thích 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 biến đổi một thùng chứa trong khi lặp lại nó.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
0

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
1

2.9 Máy phát điện

Sử dụng máy phát điện khi cần thiết.

2.9.1 Định nghĩa

Một hàm Trình tạo trả về một trình lặp lại mang lại một giá trị mỗi khi nó thực thi một 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 máy phát được treo cho đến khi cần giá trị tiếp theo.

2.9.2 Ưu điểm

Mã đơn giản hơn, bởi vì trạng thái của các biến cục bộ và luồng điều khiển được bảo tồn cho mỗi cuộc gọi. Một trình tạo sử dụng ít bộ nhớ hơn một hàm tạo toàn bộ danh sách các giá trị cùng một lúc.

2.9.3 nhược điểm

Các biến cục bộ trong máy phát sẽ không được thu gom rác cho đến khi máy phát điện được tiêu thụ đến kiệt sức hoặc chính nó được thu thập rác.

2.9.4 Quyết định

Khỏe. Sử dụng năng suất của người dùng: Thay vì trả về của người khác: trong số các chức năng của DocString cho các chức năng của máy phát điện.

Nếu máy phát quản lý một tài nguyên đắt tiền, hãy đảm bảo buộc phải dọn dẹp.

Một cách tốt để làm sạch là bằng cách gói trình tạo bằng trình quản lý bối cảnh PEP-0533.

2.10 Chức năng Lambda

Được rồi cho một lớp lót. Thích biểu thức máy phát trên

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
75 hoặc
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
76 với
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
77.

2.10.1 Định nghĩa

Lambdas xác định các hàm ẩn danh trong một biểu thức, trái ngược với một tuyên bố.

2.10.2 Ưu điểm

Convenient.

2.10.3 Nhược điểm

Khó đọc và gỡ lỗi hơn các chức năng địa phương. 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ì hàm 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. Nếu mã bên trong hàm Lambda dài hơn 60-80 ký tự, thì có lẽ tốt hơn là định nghĩa nó là hàm lồng nhau thông thường.

Đối với các hoạt động phổ biến như phép nhân, hãy sử dụng các chức năng từ mô -đun

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
83 thay vì các hàm Lambda. Ví dụ, thích
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
84 đến
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
85.

2.11 Biểu thức có điều kiện

Được rồi cho những trường hợp đơn giản.

2.11.1 Định nghĩa

Các biểu thức có điều kiện (đôi khi được gọi là toán tử ternary của người Hồi giáo) là các cơ chế cung cấp cú pháp ngắn hơn cho các câu lệnh IF. Ví dụ:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
86.

2.11.2 Ưu điểm

Ngắn hơn và thuận tiện hơn một câu lệnh if.

2.11.3 Nhược điểm

Có thể khó đọc hơn một câu lệnh IF. Điều kiện có thể khó định vị 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 phù hợp với một dòng: biểu hiện đúng, biểu hiện if, biểu hiện khác. Sử dụng một tuyên bố hoàn chỉnh khi mọi thứ trở nên phức tạp hơn.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
2

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
3

2.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ĩa

Bạn có thể chỉ định các giá trị cho các biến ở cuối danh sách tham số hàm, ví dụ:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
87. Nếu
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
88 được gọi chỉ với một đối số,
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
89 sẽ được đặt thành 0. Nếu nó được gọi với hai đối số,
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
89 có giá trị của đối số thứ hai.

2.12.2 Ưu điểm

Thông thường bạn có một hàm sử dụng nhiều giá trị mặc định, nhưng trong những trường hợp hiếm hoi, bạn muốn ghi đè các mặc định. Các giá trị đối số mặc định cung cấp một cách dễ dàng để làm điều này, mà không phải xác định nhiều chức năng cho các trường hợp ngoại lệ hiếm. Vì Python không hỗ trợ các phương thức/hàm bị quá tải, các đối số mặc định là một cách dễ dàng để giả mạo hành vi quá tải.

2.12.3 nhược điểm

Đối số mặc định được đánh giá một lần tại thời gian tải mô -đun. Điều này có thể gây ra vấn đề nếu đối số là một đối tượng có thể thay đổi như danh sách hoặc từ điển. Nếu hàm sửa đổi đối tượng (ví dụ: bằng cách nối một mục vào danh sách), giá trị mặc định sẽ được sửa đổi.

2.12.4 Quyết định

Được rồi để sử dụng với những 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.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
4

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
5

2.13 Thuộc tính

Cá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 tầm thường hoặc logic. Việc triển khai tài sản phải phù hợp với những kỳ vọng chung về quyền truy cập thuộc tính thông thường: rằng chúng rẻ, đơn giản và không có gì đáng ngạc nhiên.

2.13.1 Định nghĩa

Một cách để bọc phương thức kêu gọi nhận và đặt mộ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

  • Cho phép API truy cập và API gán thuộc tính thay vì các cuộc gọi phương thức Getter và Setter.
  • Có thể được sử dụng để thực hiện một thuộc tính chỉ đọc.
  • Cho phép tính toán lười biếng.
  • Cung cấp một cách để duy trì giao diện công cộng của một lớp khi nội bộ phát triển độc lập với người dùng lớp.

2.13.3 Nhược điểm

  • Có thể ẩn tác dụng phụ giống như quá tải người vận hành.
  • Có thể gây nhầm lẫn cho các lớp con.

2.13.4 Quyết định

Cá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 kỳ vọng của quyền truy cập thuộc tính điển hình; Thực hiện theo các quy tắc getters và setters khác.

Ví dụ: sử dụng một thuộc tính để chỉ đơn giản là có được và đặt một thuộc tính nội bộ được phép: không có tính toán xảy ra, do đó, tài sản không cần thiết (thay vào đó, công khai thuộc tính). Để so sánh, 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 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 ra với bộ trang trí

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
91. Thực hiện thủ công một mô tả thuộc tính được coi là một tính năng năng lượng.

Kế 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 các tính toán mà một lớp con có thể muốn ghi đè và mở rộng.

2.14 Đánh giá đúng/sai

Sử dụng các tính năng giả mạo của người Viking nếu có thể.

2.14.1 Định nghĩa

Python đánh giá các giá trị nhất định là

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
92 khi trong bối cảnh Boolean. Một quy tắc nhanh chóng của ngón tay cái, là tất cả các giá trị trống rỗng của người dùng được coi là sai, do đó, tất cả đều đánh giá là sai trong bối cảnh boolean.

2.14.2 Ưu điểm

Các điều kiện sử dụng Booleans Python dễ đọc hơn và ít dễ bị lỗi hơn. Trong hầu hết các trường hợp, họ cũng nhanh hơn.

2.14.3 nhược điểm

Có thể trông lạ đối với các nhà phát triển C/C ++.

2.14.4 Quyết định

Sử dụng các tính năng giả mạo của người Viking nếu có thể, ví dụ,

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
94 thay vì
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
95. Có một vài cảnh báo mà bạn nên ghi nhớ mặc dù:

  • Luôn luôn sử dụng

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    96 (hoặc
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    97) để kiểm tra giá trị
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    98. Ví dụ: khi kiểm tra xem một biến hoặc đối số mặc định là
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    98 đã được đặt thành một số giá trị khác. Giá trị khác có thể là một giá trị mà sai trong bối cảnh boolean!

  • Không bao giờ so sánh một biến boolean với

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    92 bằng cách sử dụng
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    01. Sử dụng
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    02 thay thế. Nếu bạn cần phân biệt
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    92 với
    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    98 thì chuỗi các biểu thức, chẳng hạn như
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    05.

  • Đối với các chuỗi (chuỗi, danh sách, bộ dữ liệu), sử dụng thực tế là các chuỗi trống là sai, do đó

    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    06 và
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    07 được ưu tiên hơn so với
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    08 và
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    09.

  • Khi xử lý các số nguyên, sai lầm ngầm có thể liên quan đến nhiều rủi ro hơn lợi ích (nghĩa là, vô tình xử lý

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    98 là 0). Bạn có thể so sánh một giá trị được biết là một số nguyên (và không phải là kết quả của
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    11) so với số nguyên 0.

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    6

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    7

  • Lưu ý rằng

    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    12 (tức là,
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    13 là chuỗi) đánh giá là true.

  • Lưu ý rằng các mảng numpy có thể nêu ra một ngoại lệ trong bối cảnh boolean ngầm. Thích thuộc tính

    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    14 khi kiểm tra độ trống của
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    15 (ví dụ:
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    16).

2.16 Phạm vi từ vựng

Được sử dụng.

2.16.1 Định nghĩa

Một hàm python lồng nhau có thể tham khảo các biến được xác định trong các hàm bao quanh, nhưng không thể gán cho chúng. Các ràng buộc biến đổi đượ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ỳ nhiệm vụ 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 trước khi chuyển nhượng. Nếu một tuyên bố 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à:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
8

2.16.2 Ưu điểm

Thường dẫn đến mã rõ ràng hơn, thanh lịch hơn. Đặc biệt thoải mái cho các lập trình viên Lisp và Sơ đồ (và Haskell và ML và ML).

2.16.3 Nhược điểm

Có thể dẫn đến những lỗi khó hiểu. Chẳng hạn như ví dụ này dựa trên PEP-0227:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
9

Vì vậy,

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
17 sẽ in
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
18, không phải
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
19.

2.16.4 Quyết định

Được sử dụng.

2.16.1 Định nghĩa

Một hàm python lồng nhau có thể tham khảo các biến được xác định trong các hàm bao quanh, nhưng không thể gán cho chúng. Các ràng buộc biến đổi đượ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ỳ nhiệm vụ 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 trước khi chuyển nhượng. Nếu một tuyên bố 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à:

2.16.2 Ưu điểm

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
0

Thường dẫn đến mã rõ ràng hơn, thanh lịch hơn. Đặc biệt thoải mái cho các lập trình viên Lisp và Sơ đồ (và Haskell và ML và ML).

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
1

2.16.3 Nhược điểm

Có thể dẫn đến những lỗi khó hiểu. Chẳng hạn như ví dụ này dựa trên PEP-0227:

Vì vậy,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
17 sẽ in
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
18, không phải
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
19.

2.16.4 Quyết định

2.17 Chức năng và phương pháp trang trí

Sử dụng các nhà trang trí một cách thận trọng khi có một lợi thế rõ ràng. Tránh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
20 và giới hạn sử dụng
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
21.

Tránh các phụ thuộc bên ngoài trong chính bộ trang trí (ví dụ: don lồng dựa vào các tệp, ổ cắm, kết nối cơ sở dữ liệu, v.v.), vì chúng có thể không có sẵn khi người trang trí chạy (tại thời điểm nhập, có lẽ từ

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
25 hoặc các công cụ khác). Một người trang trí được gọi với các tham số hợp lệ nên (càng nhiều càng tốt) được đảm bảo để thành công trong mọi trường hợp.

Các nhà trang trí là một trường hợp đặc biệt của mã cấp cao nhất của Cameron - xem chính để thảo luận thêm.

Không bao giờ sử dụng

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
20 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ó. Viết một hàm cấp mô -đun thay thế.

Chỉ sử dụng

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
21 khi viết một hàm tạo có tên hoặc thói quen cụ thể của lớp để sửa đổi trạng thái toàn cầu cần thiết như bộ đệm toàn quy trình.

2.18 Xán

Khô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 loại dữ liệu tích hợp của Python, như từ điển dường như có hoạt động nguyên tử, có những trường hợp góc mà chúng không phải là nguyên tử (ví dụ: nếu

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
28 hoặc
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
29 được thực hiện dưới dạng phương pháp Python) và không nên dựa vào nguyên tử. Bạn cũng không nên dựa vào phân công biến nguyên tử (vì điều này lần lượt phụ thuộc vào từ điển).

Sử dụng kiểu dữ liệu mô -đun hàng đợi ____ ____230 làm cách ưa thích để truyền đạt dữ liệu giữa các luồng. Nếu không, sử dụng mô -đun luồng và các nguyên thủy khóa của nó. Thích các biến điều kiện và

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
31 thay vì sử dụng khóa cấp thấp hơn.

2.19 Các tính năng năng lượng

Tránh những tính năng này.

2.19.1 Định nghĩa

Python 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 lạ mắt như các metaclass tùy chỉnh, truy cập vào mã byte, biên dịch trực tiếp, kế thừa động, Ăn lặp lại đối tượng, hack nhập, phản ánh (ví dụ: một số cách sử dụng

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
32), sửa đổi nội bộ hệ thống ,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
33 Phương pháp 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 nhỏ gọn hơn.

2.19.3 nhược điểm

Nó rất hấp dẫn khi sử dụng các tính năng của Cool Cool này khi chúng không hoàn toàn cần thiết. Nó khó đọc hơn, hiểu và gỡ lỗi mã mà sử dụng các tính năng khác thường bên dưới. Lúc đầu, nó không có vẻ như vậy (với tác giả gốc), nhưng khi xem lại mã, nó có xu hướng khó khăn hơn mã dài hơn nhưng đơn giản.

2.19.4 Quyết định

Tránh các tính năng này trong mã của bạn.

Các mô -đun thư viện tiêu chuẩn và các lớp sử dụng nội bộ các tính năng này là ổn để sử dụng (ví dụ:

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
34,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
35 và
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
36).

2.20 Python hiện đại: từ __future__ nhập khẩu

Phiên bản ngôn ngữ mới Những thay đổi ngữ nghĩa có thể được kiểm soát đằng sau một nhập khẩu trong tương lai đặc biệt để cho phép chúng trên cơ sở mỗi tệp trong thời gian sớm.

2.20.1 Định nghĩa

Có thể bật một số tính năng hiện đại hơn thông qua các câu lệnh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
37 cho phép sử dụng sớm các tính năng từ các phiên bản Python trong tương lai dự kiến.

2.20.2 Ưu điểm

Điều này đã được chứng minh là làm cho 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ở mỗi tệp trong khi tuyên bố khả năng tương thích và ngăn chặn hồi quy trong các tệp đó. Mã hiện đại có thể duy trì hơn vì nó ít có khả năng tích lũy nợ kỹ thuật sẽ có vấn đề trong quá trình nâng cấp thời gian chạy trong tương lai.

2.20.3 Nhược điểm

Mã đó có thể không hoạt động trên các phiên bản phiên dịch rất cũ trước khi giới thiệu tuyên bố cần thiết trong tương lai. Sự cần thiết cho điều này là phổ biến hơn trong các dự án hỗ trợ nhiều môi trường cực kỳ khác nhau.

2.20.4 Quyết định

từ __future__ nhập khẩu

Sử dụng các tuyên bố

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
38 đượ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 hôm nay. Khi bạn không còn cần phải chạy trên một phiên bản trong đó các tính năng được ẩn đằng sau nhập
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
39, hãy thoải mái xóa các dòng đó.

Trong mã có thể thực thi trên các phiên bản cũ là 3.5 thay vì> = 3.7, nhập:

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
2

Để biết thêm thông tin, hãy đọc tài liệu định nghĩa câu lệnh Python Future.

Xin đừng loại bỏ các nhập khẩu này cho đến khi bạn tự tin rằng mã 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 nhập trong tương lai cụ thể cho phép mã của bạn ngay hôm nay, việc giữ nó trong tệp sẽ ngăn chặn các sửa đổi sau của mã không xảy ra tùy thuộc vào hành vi cũ.

Sử dụng các báo cáo nhập

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
40 khác khi bạn thấy phù hợp.

2.21 Loại mã chú thích

Bạn có thể chú thích mã Python bằng các gợi ý loại theo PEP-484 và kiểm tra loại mã tại thời điểm xây dựng với một công cụ kiểm tra loại như pytype.

Loại chú thích có thể nằm trong nguồn hoặc trong tệp PYI sơ khai. Bất cứ khi nào có thể, các chú thích nên ở trong nguồn. Sử dụng các tệp PYI cho các mô-đun bên thứ ba hoặc mở rộng.

2.21.1 Định nghĩa

Loại chú thích (hoặc loại gợi ý loại trực tuyến) dành cho các đối số chức năng hoặc phương thức và giá trị trả về:

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
3

Bạn cũng có thể khai báo loại biến bằng cú pháp PEP-526 tương tự:

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
4

2.21.2 Ưu điểm

Loại chú thích cải thiện khả năng đọc và khả năng duy trì của 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 các lỗi thời gian xây dựng và giảm khả năng sử dụng các tính năng năng lượng của bạn.

2.21.3 Nhược điểm

Bạn sẽ phải giữ các khai báo loại được cập nhật. Bạn có thể thấy các lỗi loại mà bạn nghĩ là mã hợp lệ. 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 năng lượng của bạn.

2.21.4 Quyết định

Bạn được khuyến khích mạnh mẽ để kích hoạt phân tích loại Python khi cập nhật mã. Khi thêm hoặc sửa đổi API công khai, bao gồm các chú thích loại và cho phép kiểm tra thông qua pytype trong hệ thống xây dựng. Vì phân tích tĩnh là 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 (như các loại suy luận sai) có thể ngăn chặn việc áp dụng bởi một số dự án. Trong các tình huống đó, các tác giả được khuyến khích thêm nhận xét với việc đi làm hoặc liên kết đến một lỗi mô tả (các) vấn đề hiện đang ngăn chặn việc áp dụng chú thích loại trong tệp xây dựng hoặc trong chính mã khi thích hợp.

3 quy tắc phong cách Python

3.1 Bán kết

Không chấm dứt cá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 trên cùng một dòng.

3.2 Chiều dài đường

Độ dài dòng tối đa là 80 ký tự.

Ngoại lệ rõ ràng cho giới hạn 80 ký tự:

  • Báo cáo nhập khẩu dài.
  • URL, tên đường dẫn hoặc cờ dài trong bình luận.
  • Các hằng số mô -đun chuỗi dài không chứa khoảng trắng sẽ bất tiện để phân chia trên các dòng như URL hoặc tên đường dẫn.
    • Pylint vô hiệu hóa bình luận. (ví dụ:
      from sound.effects import echo
      ...
      echo.EchoFilter(input, output, delay=0.7, atten=4)
      
      41)

Không sử dụng tiếp tục dòng lùi ngoại trừ các câu lệnh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
42 yêu cầu ba hoặc nhiều người quản lý ngữ cảnh.

Sử dụng dòng Python Python tham gia vào dấu ngoặc đơn, ngoặc và niềng răng. Nếu cần thiết, bạn có thể thêm một cặp dấu ngoặc đơn xung quanh một biểu thức.

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
5

Khi một chuỗi theo nghĩa đen giành được sự phù hợp trên một dòng, hãy sử dụng dấu ngoặc đơn để nối dòng ẩn.

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
6

Trong các bình luận, đặt các URL dài vào dòng riêng của họ nếu cần thiết.

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
7

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
8

Đượ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

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
42 có biểu thức kéo dài ba dòng trở lên. Đối với hai dòng biểu thức, hãy sử dụng câu lệnh
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
42 lồng nhau:

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
9

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
0

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
1

Ghi lại sự thụt của các yếu tố trong các ví dụ tiếp tục dòng ở trên; Xem phần thụt để giải thích.

Trong tất cả các trường hợp khác mà một dòng vượt quá 80 ký tự và hình dạng tự động YAPF không giúp đưa dòng dưới giới hạn, dòng được phép vượt quá mức tối đa này. Các tác giả được khuyến khích để phá vỡ thủ công dòng trên các ghi chú ở trên khi nó hợp lý.

3,3 ngoặc đơn

Sử 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 các bộ dữ liệu. Không sử dụng chúng trong các câu lệnh trả lại hoặc các câu lệnh có điều kiện trừ khi sử dụng dấu ngoặc đơn để tiếp tục dòng ngụ ý hoặc để chỉ ra một tuple.

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
2

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
3

3.4 thụt

Thở các khối mã của bạn với 4 không gian.

Không bao giờ sử dụng tab. Tiếp tục dòng ngụ ý nên căn chỉnh các phần tử được bọc theo chiều dọc (xem các ví dụ độ dài dòng) hoặc sử dụng thụt 4 không gian treo. Đóng giá đỡ (tròn, hình vuông hoặc xoăn) có thể được đặt ở cuối biểu thức hoặc trên các đường riêng biệt, nhưng sau đó nên được thụt vào giống như đường với khung mở tương ứng.

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
4

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
5

3.4.1 Dấu phẩy theo trình tự các mặt hàng?

Dấu phẩy theo trình tự các mục chỉ được khuyến nghị khi mã thông báo đóng thùng

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
45,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
46 hoặc
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
47 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 kéo dài cũng được sử dụng như một gợi ý cho YAPF tự động mã Python của chúng tôi để hướng nó tự động định dạng container của các mục đến một mục trên mỗi dòng khi
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
48 sau khi phần tử cuối cùng có mặt.

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
6

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
7

3.5 dòng trống

Hai dòng trống giữa các định nghĩa cấp cao nhất, có thể là chức năng hoặc định nghĩa lớp. Một ranh giới trống giữa các định nghĩa phương thức và giữa dòng

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
49 và phương thức đầu tiên. Không có dòng trống theo dòng
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
50. Sử dụng các dòng trống đơn khi bạn đánh giá thích hợp trong các chức năng hoặc phương pháp.

Các dòng trống không cần phải neo theo định nghĩa. Ví dụ, các nhận xét liên quan ngay trước chức năng, lớp và định nghĩa phương thức có thể có ý nghĩa. Hãy xem xét nếu nhận xét của bạn có thể hữu ích hơn như là một phần của DocString.

3.6 Whitespace

Thực hiện theo các quy tắc đánh máy tiêu chuẩn để sử dụng không gian xung quanh dấu chấm câu.

Không có khoảng trắng bên trong dấu ngoặc đơn, ngoặc hoặc niềng răng.

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
8

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
9

Không có khoảng trắng trước dấu phẩy, dấu chấm phẩy hoặc đại tràng. Sử dụng khoảng trắng sau dấu phẩy, dấu chấm phẩy hoặc đại tràng, ngoại trừ ở cuối dòng.

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
0

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
1

Không có khoảng trắng nào trước paren/khung mở bắt đầu một danh sách đối số, lập chỉ mục hoặc cắt.

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
2

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
3

Không có khoảng trắng nào.

Các toán tử nhị phân bao quanh với một không gian duy nhất ở hai bên để gán (

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
51), so sánh (
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
52) và booleans (
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
53). Sử dụng phán đoán tốt hơn của bạn để chèn các không gian xung quanh các toán tử số học (
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
54,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
55,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
56,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
57,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
58,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
59,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
60,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
22).

Không bao giờ sử dụng các khoảng trống xung quanh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
51 khi truyền từ khóa đối số 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 các khoảng trống xung quanh
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
51 cho giá trị tham số mặc định.

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
4

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
5

Don Tiết sử dụng không gian để căn chỉnh theo chiều dọc trên các dòng liên tiếp, vì nó trở thành gánh nặng bảo trì (áp dụng cho

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
64,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
65,
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
51, v.v.):

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
6

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
7

3.7 Dòng Shebang

Hầu hết các tệp

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
67 không cần bắt đầu với dòng
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
68. Bắt đầu tệp chính của một chương trình với
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
69 (để hỗ trợ VirtualEnvs) hoặc
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
70 mỗi PEP-394.

Dòng này được sử dụng bởi hạt nhân để tìm trình thông dịch Python, nhưng bị Python bỏ qua khi nhập các mô -đun. Nó chỉ cần thiết trên một tệp dự định sẽ được thực thi trực tiếp.

3.8 Nhận xét và tài liệu

Hãy chắc chắn sử dụng đúng kiểu cho mô -đun, chức năng, phương thức tài liệu và nhận xét nội tuyến.

3.8.1 Docstrings

Python sử dụng DocStrings để tài liệu mã. DocString là một chuỗi là câu lệnh đầu tiên trong gói, mô -đun, lớp hoặc chức năng. Các chuỗi này có thể được trích xuất tự động thông qua thành viên

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
71 của đối tượng và được sử dụng bởi
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
25. . Một DocString nên được tổ chức như một dòng tóm tắt (một dòng vật lý không vượt quá 80 ký tự) bị chấm dứt bởi một khoảng thời gian, dấu câu hỏi hoặc dấu chấm than. Khi viết thêm (được khuyến khích), điều này phải được theo sau bởi một dòng trống, theo sau là phần còn lại của tài liệu bắt đầu ở cùng vị trí con trỏ như trích dẫn đầu tiên của dòng đầu tiên. Có nhiều hướng dẫn định dạng cho các tài liệu dưới đây.

3.8.2 Mô -đun

Mỗi tập tin nên chứa nồi hơi giấy phép. Chọn Bản tin nồi hơi thích hợp cho giấy phép được sử dụng bởi dự án (ví dụ: Apache 2.0, BSD, LGPL, GPL)

Các tệp nên bắt đầu với một DocString mô tả nội dung và việc sử dụng mô -đun.

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
8

3.8.3 Chức năng và phương pháp

Trong phần này, chức năng của người Viking có nghĩa là một phương thức, hàm hoặc trình tạo.

Một chức năng phải có một tài liệu, trừ khi nó đáp ứng tất cả các tiêu chí sau:

  • không nhìn thấy bên ngoài
  • rất ngắn
  • rõ ràng

Một DocString nên cung cấp đủ thông tin để viết một cuộc gọi cho chức năng mà không cần đọc mã chức năng. DocString nên mô tả chức năng Cú pháp gọi và ngữ nghĩa của nó, nhưng nói chung không phải là chi tiết thực hiện của nó, trừ khi những chi tiết đó có liên quan đến cách sử dụng chức năng. Ví dụ, một hàm làm biến đổi một trong những đối số của nó như là một tác dụng phụ cần lưu ý rằng trong tài liệu của nó. Mặt khác, các chi tiết tinh tế nhưng quan trọng của việc triển khai chức năng không liên quan đến người gọi được thể hiện tốt hơn dưới dạng nhận xét bên cạnh mã so với trong chức năng của DocString.

DocString phải là kiểu mô tả (

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
75) chứ không phải là kiểu mệnh lệnh (
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
76). DocString cho bộ mô tả dữ liệu
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
91 nên sử dụng cùng một kiểu với DocString cho một thuộc tính hoặc đối số hàm (
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
78, thay vì
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
79).

Một phương thức ghi đè một phương thức từ một lớp cơ sở có thể có một tài liệu đơn giản gửi người đọc đến phương thức ghi đè của nó, do DocString, chẳng hạn như

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
80. Lý do là không cần phải lặp lại ở nhiều nơi tài liệu đã có trong phương thức cơ bản. Tuy nhiên, nếu phương thức ghi đè hành vi khác nhau đáng kể so với phương thức được ghi đè hoặc cần cung cấp chi tiết (ví dụ: ghi lại các tác dụng phụ bổ sung), thì một tài liệu có ít nhất những 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 hàm nên được ghi lại trong các phần đặc biệt, được liệt kê dưới đây. Mỗi phần bắt đầu với một đường tiêu đề, kết thúc bằng một dấu hai chấm. Tất cả các phần khác ngoài tiêu đề nên duy trì vết lõm của hai hoặc bốn không gian (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 có đủ thông tin để nó có thể được mô tả một cách khéo léo bằng cách sử dụng tài liệu một dòng.

Args: Liệt kê từng tham số theo tên. Một mô tả nên theo tên, và được phân tách bằng một dấu hai chấm, theo sau là một không gian hoặc dòng mới. Nếu mô tả quá dài để phù hợp với một dòng 80 ký tự duy nhất, hãy sử dụng thụt vào khoảng 2 hoặc 4 khoảng trống so với tên tham số (phù hợp với phần còn lại của các tài liệu trong tệp). Mô tả nên bao gồm (các) loại yêu cầu 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
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
81 (Danh sách đối số độ dài biến) và/hoặc
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
82 (đối số từ khóa tùy ý), chúng nên được liệt kê là
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
81 và ________ 282.RENRURNS: (hoặc mang lại: Đối với 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, phần này không bắt buộc. Nó cũng có thể được bỏ qua nếu DocString bắt đầu với lợi nhuận hoặc sản lượng (ví dụ:
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
85) và câu mở là đủ để mô tả giá trị trả về. Không bắt chước ‘phong cách numpy (ví dụ), thường ghi lại giá trị trả về tuple như thể nó là nhiều giá trị trả về với các tên riêng lẻ (không bao giờ đề cập đến tuple). Thay vào đó, hãy mô tả một giá trị trả về như vậy như: Trả về: Một tuple (mat_a, mat_b), trong đó mat_a là trên, và Hồi. Các tên phụ trợ trong DocString 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 cơ thể hàm (vì chúng không phải là một phần của API) .raies: Liệt kê tất cả các trường hợp ngoại lệ có liên quan đến giao diện theo sau là mô tả. Sử dụng một tên ngoại lệ tương tự + đại tràng + không gian hoặc dòng mới và kiểu thụt lề như được mô tả trong args:. Bạn không nên ghi lại các ngoại lệ được nêu ra nếu API được chỉ định trong DocString bị vi phạm (vì điều này sẽ thực hiện hành vi nghịch lý khi vi phạm phần API của API).

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
9

Tương tự, biến thể này trên

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
86 với độ ngắt dòng cũng được cho phép:

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
0

3.8.4 Lớp học

Các lớp nên có một 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 nên được ghi lại ở đây trong phần

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
87 và tuân theo định dạng tương tự như một phần
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
88.

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
1

Tất cả các tài liệu lớp nên bắt đầu với một bản tóm tắt một dòng mô tả những gì thể hiện lớp đại diện. Điều này ngụ ý rằng các lớp con của

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
61 cũng nên mô tả những gì ngoại lệ đại diện, chứ không phải bối cảnh mà nó có thể xảy ra. Các tài liệu lớp không nên 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.

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
2

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
3

3.8.5 bình luận khối và nội tuyến

Nơi cuối cùng để có ý kiến ​​là những phần khó khăn của mã. Nếu bạn sẽ phải giải thích nó tại đá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 bình luận trước khi các hoạt động bắt đầu. Những người không rõ ràng nhận được ý kiến ​​ở cuối dòng.

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
4

Để cải thiện mức độ dễ đọc, những bình luận này nên bắt đầu ít nhất 2 khoảng trống so với mã với ký tự nhận xét

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
65, tiếp theo là ít nhất một khoảng trống trước văn bản của chính nhận xét.

Mặt khác, không bao giờ mô tả mã. Giả sử người đọc mã biết Python (mặc dù không phải những gì bạn đang cố gắng làm) tốt hơn bạn.

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
5

3.8.6 Dấu câu, Chính tả và Ngữ pháp

Hãy chú ý đến dấu câu, chính tả và ngữ pháp; Nó dễ đọc các bình luận được viết tốt hơn những ý kiến ​​được viết xấu.

Nhận xét nên có thể đọc được như văn bản tường thuật, với vốn hóa và dấu câu đúng đắn. Trong nhiều trường hợp, câu hoàn chỉnh dễ đọc hơn các đoạn câu. Nhận xét ngắn hơn, chẳng hạn như nhận xét ở cuối dòng mã, đôi khi có thể ít trang trọng hơn, nhưng bạn nên phù hợp với phong cách của mình.

Mặc dù có thể gây khó chịu khi có một người đánh giá mã chỉ ra rằng bạn đang sử dụng dấu phẩy khi 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 duy trì mức độ rõ ràng và dễ đọc cao. Dấu câu, chính tả và ngữ pháp thích hợp giúp đỡ với mục tiêu đó.

3.10 Chuỗi

Sử dụng chuỗi F, toán tử

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
59 hoặc phương thức
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
92 để định dạng chuỗi, ngay cả khi các tham số là tất cả các chuỗi. Sử dụng phán đoán tốt nhất của bạn để quyết định giữa định dạng
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
54 và chuỗi.

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
6

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
7

Tránh sử dụng các toán tử

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
54 và
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
95 để tích lũy một chuỗi trong vòng lặp. Trong một số điều kiện, việc tích lũy một chuỗi với việc bổ sung có thể dẫn đến thời gian chạy bậc hai thay vì thời gian chạy tuyến tính. Mặc dù các tích lũy phổ biến của loại này có thể được tối ưu hóa trên Cpython, đó là một chi tiết thực hiện. Các điều kiện theo đó á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 mỗi phần phụ vào danh sách và
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
96 Danh sách sau khi vòng lặp chấm dứt hoặc viết từng bộ nền cho bộ đệm
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
97. Những kỹ thuật này liên tục có độ phức tạp thời gian chạy tuyến tính.

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
8

No:
  # Unclear what module the author wanted and what will be imported.  The actual
  # import behavior depends on external factors controlling sys.path.
  # Which possible jodie module did the author intend to import?
  import jodie
9

Hãy phù hợp 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. Chọn

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
98 hoặc
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
99 và gắn bó với nó. Không sao khi sử dụng ký tự trích dẫn khác trên một chuỗi để tránh sự cần thiết phải dấu gạch chéo ngược các ký tự trích dẫn trong chuỗi.

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
0

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
1

Thích

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
74 cho các chuỗi nhiều dòng hơn là
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
01. Các dự án có thể chọn sử dụng
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
01 cho tất cả các chuỗi đa dòng không phải docString nếu và chỉ khi chúng cũng sử dụng
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
98 cho các chuỗi thông thường. Docstrings phải sử dụng
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
74 bất kể.

Các chuỗi đa dòng không chảy với sự thụt 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 không gian vào chuỗi, hãy sử dụng chuỗi một dòng được nối hoặc một chuỗi đa dòng với

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
05 để xóa không gian ban đầu trên mỗi dòng:

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
2

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
3

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
4

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
5

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
6

3.10.1 Ghi nhật ký

Đối với các chức năng ghi nhật ký mong đợi một chuỗi mẫu (với %-place nắm giữ) là đối số đầu tiên của họ: Luôn gọi chúng bằng một chuỗi theo nghĩa đen (không phải là một chuỗi F!) Là đối số đầu tiên của họ với các tham số mẫu như các đố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 ghi nhận như một trường có thể truy vấn. Nó cũng ngăn chặn thời gian đưa ra một thông báo rằng không có logger nào được cấu hình theo đầu ra.

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
7

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
8

Yes:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.

    Raises:
      ConnectionError: If no available port is found.
    """
    if minimum < 1024:
      # Note that this raising of ValueError is not mentioned in the doc
      # string's "Raises:" section because it is not appropriate to
      # guarantee this specific behavioral reaction to API misuse.
      raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
    port = self._find_next_open_port(minimum)
    if port is None:
      raise ConnectionError(
          f'Could not connect to service on port {minimum} or higher.')
    assert port >= minimum, (
        f'Unexpected port {port} when minimum was {minimum}.')
    return port
9

3.10.2 Thông báo lỗi

Thông báo lỗi (chẳng hạn như: chuỗi tin nhắn trên các ngoại lệ như

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
55 hoặc tin nhắn được hiển thị cho người dùng) nên tuân theo ba hướng dẫn:

  1. Thông báo cần phải khớp chính xác với điều kiện lỗi thực tế.

  2. Các mảnh nội suy cần phải luôn luôn được xác định rõ ràng như vậy.

  3. Chúng nên cho phép xử lý tự động đơn giản (ví dụ: Grepping).

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
0

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
1

3.11 Tệp, ổ cắm và tài nguyên trạng thái tương tự

Đóng các tập tin và ổ cắm rõ ràng khi thực hiện với chúng. Quy tắc này tự nhiên mở rộng sang các tài nguyên có thể đóng cửa các ổ cắm nội bộ, chẳng hạn như kết nối cơ sở dữ liệu và các tài nguyên khác cần được đóng lại theo cách tương tự. Để chỉ đặt tên cho một vài ví dụ, điều này cũng bao gồm ánh xạ MMAP, các đối tượng tệp H5PY và Windows matplotlib.pyplot.

Rời khỏi các tệp, ổ cắm hoặc các đối tượng trạng thái khác như vậy mở một cách không cần thiết có nhiều nhược điểm:

  • Họ có thể tiêu thụ tài nguyên hệ thống hạn chế, chẳng hạn như mô tả tệp. Mã liên quan đến nhiều đối tượng như vậy có thể làm cạn kiệt các tài nguyên đó một cách không cần thiết nếu chúng không trở lại hệ thống ngay sau khi sử dụng.
  • Việc giữ các tệp mở có thể ngăn chặn các hành động khác như di chuyển hoặc xóa chúng hoặc mở một hệ thống tập tin.
  • Các tệp và ổ cắm được chia sẻ trong suốt một chương trình có thể vô tình được đọc từ hoặc được viết đến sau khi đóng một cách logic. Nếu họ thực sự đóng cửa, các nỗ lực đọc hoặc viết từ họ sẽ nêu ra các ngoại lệ, làm cho vấn đề được biết sớm hơn.

Hơn nữa, trong khi các tệp và ổ cắm (và một số tài nguyên hành xử tương tự) tự động được đóng khi đối tượng bị phá hủy, việc ghép thời gian của đối tượng với trạng thái của tài nguyên là thực hành kém:

  • Không có gì đảm bảo khi nào thời gian chạy thực sự sẽ gọi phương pháp
    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    33. Các triển khai Python khác nhau sử dụng các kỹ thuật quản lý bộ nhớ khác nhau, chẳng hạn như thu gom rác bị trì hoãn, có thể làm tăng sự trọn đời của đối tượng một cách tùy ý và vô thời hạn.
  • Các tài liệu tham khảo bất ngờ cho tệp, ví dụ: Trong toàn cầu hoặc các dấu vết ngoại lệ, có thể giữ nó dài hơn dự định.

Dựa vào Finalizer để làm sạch 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 ví dụ: bài viết này cho Java).

Cách ưa thích để quản lý các tệp và tài nguyên tương tự là sử dụng câu lệnh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
42:

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
2

Đối với các đối tượng giống như tệp không hỗ trợ câu lệnh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
42, hãy sử dụng
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
10:

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
3

Trong những trường hợp hiếm hoi khi quản lý tài nguyên dựa trên bối 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ý tuổi thọ tài nguyên.

Sử dụng các nhận xét

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 cho mã tạm thời, một giải pháp ngắn hạn hoặc đủ tốt nhưng không hoàn hảo.

Một nhận xét

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 bắt đầu với từ
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 trong tất cả các giới hạn và một định danh bối cảnh. Lý tưởng nhất là một tham chiếu lỗi, đôi khi là một tên người dùng. Một tài liệu tham khảo lỗi như
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
14 là thích hợp hơn, bởi vì các lỗi được theo dõi và 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.
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 được theo sau bởi một lời giải thích về những gì phải làm.

Mục đích là có một định dạng

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 nhất quán có thể được tìm kiếm để tìm hiểu làm thế nào để có thêm chi tiết. Một
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 không phải là một cam kết mà người được tham chiếu sẽ khắc phục sự cố. Do đó, khi bạn tạo một
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 với tên người dùng, nó hầu như luôn luôn là tên người dùng của riêng bạn.

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
4

Nếu

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
11 của bạn có biểu mẫu vào một ngày trong tương lai, hãy đảm bảo rằng bạn bao gồm một ngày rất cụ thể (sửa chữa vào tháng 11 năm 2009) hoặc một sự kiện rất cụ thể .) Rằng những người bảo trì mã trong tương lai sẽ hiểu.

3.13 Định dạng nhập khẩu

Nhập khẩu phải có trên các dòng riêng biệt; Có những trường hợp ngoại lệ cho nhập khẩu

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
46 và
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
47.

E.g.:

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
5

Nhập khẩu luôn được đặt ở đầu tệp, ngay sau khi bất kỳ bình luận và tài liệu mô -đun nào và trước khi mô -đun toàn cầu và hằng số. Nhập khẩu phải được nhóm từ hầu hết các chung chung đến ít nhất:

  1. Báo cáo nhập khẩu trong tương lai Python. Ví dụ:

    No:
      def connect_to_next_port(self, minimum: int) -> int:
        """Connects to the next available port.
    
        Args:
          minimum: A port value greater or equal to 1024.
    
        Returns:
          The new minimum port.
        """
        assert minimum >= 1024, 'Minimum port must be at least 1024.'
        port = self._find_next_open_port(minimum)
        assert port is not None
        return port
    
    6

    Xem ở trên để biết thêm thông tin về những điều đó.

  2. Nhập khẩu thư viện tiêu chuẩn Python. Ví dụ:

  3. Mô-đun bên thứ ba hoặc nhập khẩu. Ví dụ:

  4. Mã kho lưu trữ kho lưu nhập phụ nhập khẩu. Ví dụ:

    No:
      def connect_to_next_port(self, minimum: int) -> int:
        """Connects to the next available port.
    
        Args:
          minimum: A port value greater or equal to 1024.
    
        Returns:
          The new minimum port.
        """
        assert minimum >= 1024, 'Minimum port must be at least 1024.'
        port = self._find_next_open_port(minimum)
        assert port is not None
        return port
    
    7

  5. Không dùng nữa: Nhập khẩu dành riêng cho ứng dụng là một phần của gói phụ cấp cao nhất như tệp này. Ví dụ: application-specific imports that are part of the same top level sub-package as this file. For example:

    No:
      def connect_to_next_port(self, minimum: int) -> int:
        """Connects to the next available port.
    
        Args:
          minimum: A port value greater or equal to 1024.
    
        Returns:
          The new minimum port.
        """
        assert minimum >= 1024, 'Minimum port must be at least 1024.'
        port = self._find_next_open_port(minimum)
        assert port is not None
        return port
    
    8

    Bạn có thể tìm thấy mã kiểu Google Python cũ hơn làm điều này, nhưng nó không còn cần thiết nữa. Mã mới được khuyến khích không bận tâm với điều này. Đơn giản chỉ cần xử lý các gói phụ dành riêng cho ứng dụng nhập khẩu giống như nhập khẩu gói phụ khác.New code is encouraged not to bother with this. Simply treat application-specific sub-package imports the same as other sub-package imports.

Trong mỗi nhóm, nhập khẩu phải được sắp xếp từ vựng, bỏ qua trường hợp, theo mỗi đường dẫn gói đầy đủ của mô -đun (

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
22 trong
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
23). Mã có thể tùy chọn đặt một dòng trống giữa các phần nhập.

No:
  def connect_to_next_port(self, minimum: int) -> int:
    """Connects to the next available port.

    Args:
      minimum: A port value greater or equal to 1024.

    Returns:
      The new minimum port.
    """
    assert minimum >= 1024, 'Minimum port must be at least 1024.'
    port = self._find_next_open_port(minimum)
    assert port is not None
    return port
9

3.14 Báo cáo

Nói chung chỉ có một tuyên bố trên mỗi dòng.

Tuy nhiên, bạn 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 chỉ khi toàn bộ câu lệnh phù hợp trên một dòng. Cụ thể, bạn không bao giờ có thể làm như vậy với ________ 164/________ 165 kể từ

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
64 và
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
65 có thể phù hợp với cùng một dòng và bạn chỉ có thể làm như vậy với
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
28 nếu không có
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
29.

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
0

3.15 Getters and Setters

Các hàm Getter và Setter (còn được gọi là người truy cập và đột biến) nên được sử dụng khi chúng cung cấp một vai trò hoặc hành vi có ý nghĩa để nhận hoặc thiết lập giá trị biến biến.

Cụ thể, chúng nên được sử dụng khi nhận hoặc thiết lập biến là phức tạp hoặc chi phí là đáng kể, hiện tại hoặc trong một tương lai hợp lý.

Ví dụ, nếu một cặp getters/setters chỉ cần đọc và viết một thuộc tính nội bộ, thuộc tính nội bộ nên được công khai thay thế. Để so sánh, nếu việc thiết lập một biến có nghĩa là một số trạng thái bị vô hiệu hoặc xây dựng lại, thì đó phải là một hàm setter. Các yêu cầu chức năng gợi ý rằng một hoạt độ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.

Getters và setters nên làm theo hướng dẫn đặt tên, chẳng hạn như

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
30 và
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
31.

Nế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 cố gắng truy cập biến bằng phương pháp cũ sẽ bị phá vỡ rõ ràng để chúng được biết về sự thay đổi về độ phức tạp.

3.16 Đặt tên

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
32,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
33,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
34,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
35,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
36,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
37,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
38,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
39,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
40,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
41,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
42,
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
43, ____344.

Tên chức năng, tên biến và tên tệp phải được mô tả; Tránh viết tắt. Cụ thể, không sử dụng các chữ viết tắt không rõ ràng hoặc không quen thuộc với độc giả 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 luôn sử dụng tiện ích mở rộng tệp

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
67. Không bao giờ sử dụng dấu gạch ngang.

3.16.1 Tên để tránh

  • Tên ký tự đơn, ngoại trừ các trường hợp được phép cụ thể:

    • bộ đếm hoặc bộ lặp (ví dụ:
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      46,
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      47,
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      48,
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      49, et al.)
    • Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      50 là một định danh ngoại lệ trong các câu lệnh
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      51.
    • Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      52 dưới dạng xử lý tệp trong các câu lệnh
      from sound.effects import echo
      ...
      echo.EchoFilter(input, output, delay=0.7, atten=4)
      
      42
    • riêng
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      54 không có ràng buộc (ví dụ:
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      55,
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      56,
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      57)

    Xin hãy chú ý không lạm dụng việc đặt tên một ký tự đơn. Nói chung, tính mô tả nên tỷ lệ thuận với tên phạm vi tầm nhìn. Ví dụ,

    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    46 có thể là một tên tốt cho khối mã 5 dòng nhưng trong nhiều phạm vi lồng nhau, nó có khả năng quá mơ hồ.

  • Dashes (

    from sound.effects import echo
    ...
    echo.EchoFilter(input, output, delay=0.7, atten=4)
    
    55) trong bất kỳ tên gói/mô -đun nào

  • Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    60 Tên (dành riêng bởi Python)

  • Điều khoản tấn công

  • Tên không cần thiết bao gồm loại biến (ví dụ:

    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    61)

3.16.2 quy ước đặt tên

  • Nội bộ có nghĩa là nội bộ của một mô -đun, hoặc được bảo vệ hoặc riêng tư trong một lớp.

  • Chi tiêu một dấu gạch dưới (

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    26) có một số hỗ trợ để bảo vệ các biến và chức năng mô -đun (linter sẽ gắn cờ truy cập thành viên được bảo vệ).

  • Chuẩn bị một dấu gạch dưới kép (

    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    63 hay còn gọi là Dunder Dunder) cho một biến thể hiện hoặc phương thức làm cho biến hoặc phương thức riêng tư cho lớp của nó (sử dụng tên mang tên); Chúng tôi không khuyến khích việc sử dụng nó vì nó tác động đến khả năng đọc và khả năng kiểm tra, và isn thực sự riêng tư. Thích một dấu gạch dưới.

  • Đặt các lớp liên quan và các hàm cấp cao nhất với nhau trong một mô-đun. Không giống như Java, không cần giới hạn bản thân một lớp cho mỗi mô -đun.

  • Sử dụng Capwords cho tên lớp, nhưng Lower_With_under.py cho tên mô -đun. Mặc dù có một số mô -đun cũ có tên capwords.py, nhưng điều này hiện không được khuyến khích bởi vì nó khó hiểu khi mô -đun xảy ra được đặt theo tên của một lớp. (Chờ đợi - Tôi đã viết

    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    64 hoặc
    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    65?

  • Dấu gạch dưới có thể xuất hiện trong các tên phương thức nhất định bắt đầu bằng

    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    66 để tách các thành phần logic của tên, ngay cả khi các thành phần đó sử dụng capwords. Một mẫu có thể là
    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    67; Ví dụ
    Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    68 là được. Không có một cách chính xác để đặt tên cho các phương thức kiểm tra.

3.16.3 Đặt tên tệp

Tên tệp Python phải có phần mở rộng

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
67 và không được chứa dấu gạch ngang (
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
55). Điều này cho phép họ được nhập khẩu và không được kiểm soát. Nếu bạn muốn một thực thi có thể truy cập được mà không cần tiện ích mở rộng, hãy sử dụng liên kết tượng trưng hoặc trình bao bọc bash đơn giản chứa
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
71.

3.16.4 Hướng dẫn có nguồn gốc từ các khuyến nghị của Guido

Loại hìnhCông cộngNội bộ
Gói
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
72
Mô -đun
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
72
Mô -đun
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
74
Các lớp học
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
75
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
76
Các lớp học
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
75
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
76
Ngoại lệ
Chức năng
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
78
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
79
Hằng số toàn cầu/lớp
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
72
Mô -đun
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
74
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
72
Mô -đun
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
74
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
76
Ngoại lệ
Chức năng
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
72
Mô -đun
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
72

Mô -đun

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
74

Các lớp học

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
75

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
76

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
1

Ngoại lệ

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
2

Chức năng

Yes: # Reference absl.flags in code with the complete name (verbose). import absl.flags from doctor.who import jodie _FOO = absl.flags.DEFINE_string(...) 78

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
79

Hằng số toàn cầu/lớp

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
80

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
81

Biến toàn cầu/lớp

Biến thể hiện

  • Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    74 (được bảo vệ)

  • Tên phương thức

    Yes:
      result = [mapping_expr for value in iterable if filter_expr]
    
      result = [{'key': value} for value in iterable
                if a_long_filter_expression(value)]
    
      result = [complicated_transform(x)
                for x in iterable if predicate(x)]
    
      descriptive_name = [
          transform({'key': key, 'value': value}, color='black')
          for key, value in generate_iterable(some_input)
          if complicated_condition_is_met(key, value)
      ]
    
      result = []
      for x in range(10):
          for y in range(5):
              if x * y > 10:
                  result.append((x, y))
    
      return {x: complicated_transform(x)
              for x in long_generator_function(parameter)
              if x is not None}
    
      squares_generator = (x**2 for x in range(10))
    
      unique_names = {user.name for user in users if user is not None}
    
      eat(jelly_bean for jelly_bean in jelly_beans
          if jelly_bean.color == 'black')
    
    3

  • Yes:
      # Reference absl.flags in code with the complete name (verbose).
      import absl.flags
      from doctor.who import jodie
    
      _FOO = absl.flags.DEFINE_string(...)
    
    79 (được bảo vệ)

  • Tham số chức năng/phương thức

  • Các biến cục bộ

    • 3.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 ưa thích khi chúng khớp với ký hiệu được thiết lập trong một bài báo tham chiếu hoặc thuật toán. Khi làm như vậy, tham chiếu nguồn của tất cả các quy ước đặt tên trong một nhận xét hoặc 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. Thích PEP8 tuân thủ
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      90 cho các API công khai, có nhiều khả năng gặp phải trong bối cảnh.
    • 3.17 Chính
    • Trong Python,
      from sound.effects import echo
      ...
      echo.EchoFilter(input, output, delay=0.7, atten=4)
      
      25 cũng như các thử nghiệm đơn vị yêu cầu các mô -đun phải được nhập khẩu. Nếu một tệp được sử dụng như một thực thi, chức năng chính của nó phải nằm trong hàm
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      92 và mã của bạn phải luôn luôn kiểm tra
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      93 trước khi thực hiện chương trình chính của bạn, để nó không được thực thi khi mô -đun được nhập.
    • Khi sử dụng ABSL, hãy sử dụng
      Yes:
        # Reference absl.flags in code with the complete name (verbose).
        import absl.flags
        from doctor.who import jodie
      
        _FOO = absl.flags.DEFINE_string(...)
      
      94:

3.19.2 Phá vỡ dòng

Cố gắng tuân theo các quy tắc thụt lề hiện có.

Sau khi chú thích, nhiều chữ ký chức năng sẽ trở thành một tham số trên mỗi dòng. Để đảm bảo loại trả về cũng được đưa ra dòng riêng, một dấu phẩy có thể được đặt sau tham số cuối cùng.

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
4

Luôn thích phá vỡ giữa các biến, và không, ví dụ, giữa các 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 đi cho nó.

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
5

Nếu sự kết hợp của tên hàm, tham số cuối cùng và loại trả về quá dài, thụt thêm 4 trong một dòng mới. Khi sử dụng ngắt dòng, thích đặt từng tham số và loại trả về trên các dòng của riêng họ và sắp xếp dấu ngoặc đơn kết thúc với

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
50:

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
6

Tùy chọn, loại trả về có thể được đặt trên cùng một dòng với tham số cuối cùng:

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
7

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
16 cho phép bạn di chuyển dấu ngoặc đơn đóng vào một dòng mới và phù hợp với phần mở đầu, nhưng điều này không thể đọc được.

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
8

Như trong các ví dụ trên, không thích phá vỡ các loại. Tuy nhiên, đôi khi chúng quá dài để ở trên một dòng duy nhất (cố gắng giữ cho các loại phụ không bị phá vỡ).

Yes:
  result = [mapping_expr for value in iterable if filter_expr]

  result = [{'key': value} for value in iterable
            if a_long_filter_expression(value)]

  result = [complicated_transform(x)
            for x in iterable if predicate(x)]

  descriptive_name = [
      transform({'key': key, 'value': value}, color='black')
      for key, value in generate_iterable(some_input)
      if complicated_condition_is_met(key, value)
  ]

  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

  return {x: complicated_transform(x)
          for x in long_generator_function(parameter)
          if x is not None}

  squares_generator = (x**2 for x in range(10))

  unique_names = {user.name for user in users if user is not None}

  eat(jelly_bean for jelly_bean in jelly_beans
      if jelly_bean.color == 'black')
9

Nếu một tên và loại quá dài, hãy xem xét sử dụng bí danh cho loại. Phương sách cuối cùng là phá vỡ sau đại tràng và thụt vào 4.

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
0

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
1

3.19.3 Khai báo chuyển tiếp

Nếu bạn cần sử dụng 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 lớp bên trong khai báo lớp hoặc nếu bạn sử dụng một lớp được xác định bên dưới - hoặc sử dụng

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
03 cho các trường hợp đơn giản hoặc sử dụng một chuỗi cho tên lớp.

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
2

3.19.4 Giá trị mặc định

Theo PEP-008, chỉ sử dụng các khoảng trống xung quanh

from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
51 cho các đối số có cả chú thích loại và giá trị mặc định.

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
3

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
4

3.19.5 Nonetype

Trong hệ thống loại Python,

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
05 là loại hạng nhất của nhóm và với mục đích gõ,
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
98 là bí danh cho
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
05. Nếu một đối số có thể là
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
98, nó phải được tuyên bố! Bạn có thể sử dụng
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
09, nhưng nếu chỉ có một loại khác, hãy sử dụng
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
10.

Sử dụng rõ ràng

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
10 thay vì ngầm
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
10. Các phiên bản trước đó của PEP 484 cho phép
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
13 được hiểu là
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
14, nhưng đó không còn là hành vi ưa thích.

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
5

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
6

3.19.6 Bí danh loại

Bạn có thể khai báo bí danh của các loại phức tạp. Tên của một bí danh nên được capword. Nếu bí danh chỉ được sử dụng trong mô -đun này, nó sẽ được _private.

Ví dụ: nếu tên của mô -đun cùng với tên của loại quá dài:

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
7

Các ví dụ khác là các loại lồng nhau phức tạp và nhiều biến trả về từ một hàm (như một tuple).

3.19.7 Bỏ qua các loại

Bạn có thể vô hiệu hóa kiểm tra loại trên một dòng với nhận xét đặc biệt

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
15.

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
16 có tùy chọn vô hiệu hóa cho các lỗi cụ thể (tương tự như lint):

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
8

3.19.8 Biến gõ

Bài tập được chú thích nếu một biến nội bộ có một loại khó hoặc không thể suy ra, chỉ định loại của nó với một gán được chú thích - sử dụng dấu hai chấm và loại giữa tên và giá trị biến (giống như được thực hiện với các đối số chức năng có giá trị mặc định) :

No:
  result = [complicated_transform(
                x, some_argument=x+1)
            for x in iterable if predicate(x)]

  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

  return ((x, y, z)
          for x in range(5)
          for y in range(5)
          if x != y
          for z in range(5)
          if y != z)
9

Kiểu nhận xét 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 của bình luận
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
17 về cuối dòng:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
00

3.19.9 Tuples vs Danh sách

Danh sách gõ chỉ có thể chứa các đối tượng thuộc một loại. Các bộ dữ liệu gõ có thể có một loại lặp lại hoặc một số phần tử được đặt với các loại khác nhau. Loại thứ hai thường được sử dụng làm loại trả về từ một hàm.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
01

3.19.10 Typevars

Hệ thống loại Python có thuốc generic. Hàm nhà máy

Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
54 là một cách phổ biến để sử dụng chúng.

Example:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
02

Một typevar có thể bị hạn chế:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
03

Một biến loại được xác định trước phổ biến trong mô -đun

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
46 là
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
20. Sử dụng nó cho nhiều chú thích có thể là
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
21 hoặc
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
22 và tất cả phải là cùng một loại.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
04

Một typevar phải có tên mô tả, trừ khi nó đáp ứng tất cả các tiêu chí sau:

  • không nhìn thấy bên ngoài
  • không bị ràng buộc

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
05

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
06

3.19.11 Các loại chuỗi

Không sử dụng

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
23 trong mã mới. Nó chỉ có khả năng tương thích Python 2/3.

Sử dụng

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
22 cho dữ liệu chuỗi/văn bản. Đối với mã liên quan đến dữ liệu nhị phân, hãy sử dụng
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
21.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
07

Nếu tất cả các loại chuỗi của một hàm luôn giống nhau, ví dụ, nếu loại trả về giống như loại đối số trong mã ở trên, hãy sử dụng bất kỳSTR nào.

3.19.12 Nhập khẩu để gõ

Đối với các ký hiệu từ các mô -đun

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
46 và
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
47 được sử dụng để hỗ trợ phân tích tĩnh và kiểm tra loại, luôn luôn tự nhập biểu tượng. Điều này giữ cho các chú thích chung súc tích hơn và phù hợp với các hoạt động gõ được sử dụng trên toàn thế giới. Bạn được phép nhập rõ ràng để nhập nhiều lớp cụ thể trên một dòng từ các mô -đun
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
46 và
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
47. Bán tại:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
08

Cho rằng cách nhập này thêm các mục vào không gian tên cục bộ, tên trong

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
46 hoặc
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
47 nên đượ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 hoặc không. Nếu có sự va chạm 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
Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
32.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
09

3.19.13 Nhập khẩu có điều kiện

Chỉ sử dụng nhập khẩu có điều kiện trong các trường hợp đặc biệt trong đó nhập khẩu bổ sung cần thiết để kiểm tra loại phải được tránh trong thời gian chạy. Mô hình này không được khuyến khích; Các lựa chọn thay thế như tái cấu trúc mã để cho phép nhập khẩu cấp cao nhất nên được ưu tiên.

Nhập khẩu chỉ cần thiết cho các chú thích loại có thể được đặt trong một khối

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
33.

  • Các loại nhập khẩu có điều kiện cần được tham chiếu là chuỗi, để tương thích về phía trước với Python 3.6 trong đó các biểu thức chú thích thực sự được đánh giá.
  • Chỉ các thực thể được sử dụng chỉ để gõ nên được xác định ở đây; Điều này bao gồm các bí danh. Nếu không, nó sẽ là một lỗi thời gian chạy, vì mô -đun sẽ không được nhập vào thời gian chạy.
  • Khối phải đúng sau khi nhập khẩu bình thường.
  • Không nên có dòng trống trong danh sách nhập khẩu.
  • Sắp xếp danh sách này như thể nó là một danh sách nhập khẩu thường xuyên.

    def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
        del beans, eggs  # Unused by vikings.
        return spam + spam + spam
    
    10

3.19.14 Phụ thuộc tròn

Sự phụ thuộc tròn được gây ra bởi việc gõ là mùi mã. 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 tròn, 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 bởi 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 phụ thuộc tròn bằng

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
00. Đặt bí danh với một 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 bất kỳ là bất kỳ). Các định nghĩa bí danh nên được tách ra khỏi nhập lần cuối theo một dòng.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
11

3.19.15 Generics

Khi chú thích, thích chỉ định các tham số loại cho các loại chung; Mặt khác, các tham số của generics sẽ được giả định là

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
00.

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
12

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
13

Nếu tham số loại tốt nhất cho một chung là

Yes:
  # Reference flags in code with just the module name (common).
  from absl import flags
  from doctor.who import jodie

  _FOO = flags.DEFINE_string(...)
00, hãy làm cho nó rõ ràng, nhưng hãy nhớ rằng trong nhiều trường hợp
Yes:
  # Reference absl.flags in code with the complete name (verbose).
  import absl.flags
  from doctor.who import jodie

  _FOO = absl.flags.DEFINE_string(...)
54 có thể phù hợp hơn:

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
14

def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
    del beans, eggs  # Unused by vikings.
    return spam + spam + spam
15

4 từ chia tay

Được nhất quán.

Nếu bạn 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 không gian xung quanh tất cả các toán tử số học của họ, bạn cũng nên như vậy. Nếu bình luận của họ có những hộp băm nhỏ xung quanh họ, hãy làm cho ý kiến ​​của bạn có một số hộp băm nhỏ xung quanh chúng.

Quan điểm của việc có hướng dẫn theo phong cách là có một từ vựng chung về mã hóa để mọi người có thể tập trung vào những gì bạn nói thay vì 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 biệt đáng kể so với mã hiện có xung quanh nó, nó sẽ đưa người đọc ra khỏi nhịp điệu của họ khi họ đi đọc nó. Tránh điều này.

Pep là hướng dẫn phong cách cho Python?

PEP 8, đôi khi đánh vần PEP8 hoặc PEP-8, là một tài liệu cung cấp các hướng dẫn và thực tiễn tốt nhất về cách viết mã Python.Nó được viết vào năm 2001 bởi Guido Van Rossum, Barry Warsaw và Nick Coghlan., sometimes spelled PEP8 or PEP-8, is a document that provides guidelines and best practices on how to write Python code. It was written in 2001 by Guido van Rossum, Barry Warsaw, and Nick Coghlan.

Hướng dẫn phong cách Python là gì?

PEP-8, hoặc đề xuất tăng cường Python, là hướng dẫn phong cách cho lập trình Python.Nó được viết bởi Guido Van Rossum, Barry Warsaw và Nick Coghlan.Nó mô tả các quy tắc để viết một mã Python đẹp và dễ đọc.. It was written by Guido van Rossum, Barry Warsaw, and Nick Coghlan. It describes the rules for writing a beautiful and readable Python code.

PEP8 có bắt buộc không?

Đây là hướng dẫn phong cách được đề xuất chính thức để viết mã Python.Bạn không bắt buộc phải tuân theo nó nói chung và chính ngôn ngữ không có cách nào để thực thi các quy tắc của PEP 8, nhưng bạn thực sự nên tuân theo các quy tắc đó.You're not required to follow it in general, and the language itself has no way of enforcing the rules of PEP 8, but you really should follow those rules.

PEP8 đại diện cho cái gì?

Đề xuất tăng cường Python 8, hoặc PEP 8, là một hướng dẫn về phong cách cho mã Python.Năm 2001, Guido Van Rossum, Barry Warsaw và Nick Coghlan đã tạo ra PEP 8 để giúp các lập trình viên Python viết mã nhất quán và có thể đọc được., or PEP 8, is a style guide for Python code. In 2001, Guido van Rossum, Barry Warsaw, and Nick Coghlan created PEP 8 to help Python programmers write consistent and readable code.