Hướng dẫn google python style guide vs pep8 - hướng dẫn kiểu google python vs pep8
Show
Đã 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 PythonMục lục
1. Bối cảnh2 Quy tắc ngôn ngữ Python 2.1 Lint 2.2 Nhập khẩu 2 Quy tắc ngôn ngữ Python2.1 Lint2.2 Nhập khẩu 2.3 gói2.4 ngoại lệ 2.5 Biến toàn cầu2.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ạo2.8 Máy lặp và toán tử mặc định 2.9 Máy phát điện2.10 Chức năng Lambda 2.11 Biểu thức có điều kiện
Các cảnh báo 16 được xác định theo tên biểu tượng ( 21) Các cảnh báo cụ thể của Google bắt đầu với 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 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 24 hơn mẫu cũ không dùng nữa 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ụ:
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 ‘ 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‘ 27, hoặc gán chúng cho ‘ 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ẩuChỉ sử dụng các câu lệnh 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ĩaCơ chế tái sử dụng để chia sẻ mã từ mô -đun này sang mô -đun khác. 2.2.2 Ưu điểmHộ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; 30 nói rằng đối tượng 31 được xác định trong mô -đun 32.2.2.3 nhược điểmTê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
Ví dụ: mô -đun 45 có thể được nhập như sau:
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:
2.3 góiNhậ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ểmTrá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ểmLà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 địnhTấ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:
(Giả sử tập tin này sống ở 49 trong đó 50 cũng tồn tại)
Thư mục nhị phân chính được đặt trong không nên được giả định là trong 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 52 đề cập đến gói thứ ba hoặc gói cấp cao nhất có tên 53, không phải là 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ĩaNgoạ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ểmDò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ểmCó 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 địnhNgoại lệ phải tuân theo các điều kiện nhất định:
2.5 Biến toàn cầuTránh các biến toàn cầu. 2.5.1 Định nghĩaCá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ểmCó 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 địnhTrá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ểmCó 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 địnhNế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 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
|
Loại hình | Công cộng | Nội bộ |
---|---|---|
Gói | 72 | |
Mô -đun | 72 | Mô -đun |
74 | Các lớp học | 75 |
76 | Các lớp học | |
75 | 76 | Ngoại lệ |
Chức năng | 78 | 79 |
Hằng số toàn cầu/lớp | 72 | Mô -đun |
74 | 72 | Mô -đun |
74 | 76 | Ngoại lệ |
Chức năng | 72 | |
Mô -đun | 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(...)
74Cá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(...)
75Yes:
# Reference absl.flags in code with the complete name (verbose).
import absl.flags
from doctor.who import jodie
_FOO = absl.flags.DEFINE_string(...)
76Yes:
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')
1Ngoạ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')
2Chứ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(...)
79Hằ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(...)
80Yes:
# Reference absl.flags in code with the complete name (verbose).
import absl.flags
from doctor.who import jodie
_FOO = absl.flags.DEFINE_string(...)
81Biến toàn cầu/lớp
Biến thể hiện
74 (được bảo 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(...)
Tên phương thức
3Yes: 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')
79 (được bảo 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(...)
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ủ
90 cho các API công khai, có nhiều khả năng gặp phải trong bối cả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(...)
- 3.17 Chính
- Trong Python,
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àmfrom sound.effects import echo ... echo.EchoFilter(input, output, delay=0.7, atten=4)
92 và mã của bạn phải luôn luôn kiểm traYes: # 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.Yes: # Reference absl.flags in code with the complete name (verbose). import absl.flags from doctor.who import jodie _FOO = absl.flags.DEFINE_string(...)
- Khi sử dụng ABSL, hãy sử dụng
94: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.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')
4Luô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')
5Nế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')
6Tù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')
7def 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')
8Như 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')
9Nế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)
0No:
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)
13.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)
23.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)
3No:
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)
43.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)
5No:
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)
63.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)
7Cá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)
83.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)
9Kiể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
003.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
013.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
02Mộ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
03Mộ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
04Mộ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
05def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
del beans, eggs # Unused by vikings.
return spam + spam + spam
063.19.11 Các loại chuỗi
Không sử dụng
23 trong mã mới. Nó chỉ có khả năng tương thích Python 2/3.Yes: # Reference flags in code with just the module name (common). from absl import flags from doctor.who import jodie _FOO = flags.DEFINE_string(...)
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
07Nế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
08Cho 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
093.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.
10def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str: del beans, eggs # Unused by vikings. return spam + spam + spam
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
113.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
12def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
del beans, eggs # Unused by vikings.
return spam + spam + spam
13Nế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
14def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
del beans, eggs # Unused by vikings.
return spam + spam + spam
154 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.