Найти в Дзене
Павлин Шарит

Google Python Style Guide

Google Python Style Guide Давайте разберём самые интересные и спорные моменты: 🚨 80 символов vs 88 — битва за читаемость Google объясняет это просто: код должен читаться в split-screen режиме, при code review на мобильных устройствах и в терминалах. Несмотря на широкие мониторы, читаемость важнее удобства # Google approach - 80 chars max def some_function( first_parameter: str, second_parameter: int, third_parameter: bool = False, ) -> str: return "result" Их аргумент — современные разработчики часто работают с несколькими окнами одновременно, и 80 символов гарантируют читаемость в любых условиях 🚫 Assert под строгим запретом для валидации # ❌ Google говорит "НЕТ" def connect_to_port(minimum: int) -> int: assert minimum >= 1024, 'Minimum port must be at least 1024.' port = self._find_next_open_port(minimum) assert port is not None return port # ✅ Google рекомендует def connect_to_port(minimum: int) -> int: if minimum < 1024: raise ValueError(f'Min. port must be at least 1024,

Google Python Style Guide

Давайте разберём самые интересные и спорные моменты:

🚨 80 символов vs 88 — битва за читаемость

Google объясняет это просто: код должен читаться в split-screen режиме, при code review на мобильных устройствах и в терминалах. Несмотря на широкие мониторы, читаемость важнее удобства

# Google approach - 80 chars max

def some_function(

first_parameter: str,

second_parameter: int,

third_parameter: bool = False,

) -> str:

return "result"

Их аргумент — современные разработчики часто работают с несколькими окнами одновременно, и 80 символов гарантируют читаемость в любых условиях

🚫 Assert под строгим запретом для валидации

# ❌ Google говорит "НЕТ"

def connect_to_port(minimum: int) -> int:

assert minimum >= 1024, 'Minimum port must be at least 1024.'

port = self._find_next_open_port(minimum)

assert port is not None

return port

# ✅ Google рекомендует

def connect_to_port(minimum: int) -> int:

if minimum < 1024:

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}')

return port

Логика железная — assert может быть отключён с флагом -O, а валидация входных данных должна работать всегда

🔍 Pylint как обязательный инструмент

Google не просто рекомендует pylint — они требуют его использование с их собственным конфигом. Это не рекомендация, а обязательство:

def do_PUT(self): # WSGI name, so pylint: disable=invalid-name

...

def viking_cafe_order(spam: str, beans: str, eggs: str | None = None) -> str:

del beans, eggs # Unused by vikings.

return spam + spam + spam

Их философия: лучше явно подавить предупреждение с объяснением, чем игнорировать все проблемы

📦 Импорты — только полные пути

# ✅ Google way

from doctor.who import jodie

import absl.flags

# ❌ Избегать

import jodie # Неясно, откуда этот модуль

Причина — избежать конфликтов имён и сделать код более предсказуемым. Даже если модуль находится в той же директории, используйте полный путь

🌐 Глобальное состояние — табу

Google категорически против изменяемого глобального состояния:

# ❌ Плохо

database_connection = None

def init_db():

global database_connection

database_connection = connect_to_db()

# ✅ Хорошо

class DatabaseManager:

def __init__(self):

self._connection = None

def get_connection(self):

if self._connection is None:

self._connection = connect_to_db()

return self._connection

Аргумент — глобальное состояние ломает инкапсуляцию и усложняет тестирование