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.

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

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 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 = 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 = 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 = 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 = 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 = 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 

Bài Viết Liên Quan

Chủ Đề