Loading...
Loading...
Apply Python style guide conventions to code
npx skill4agent add the-perfect-developer/the-perfect-opencode pythonmodule_name.pypackage_nameClassNamefunction_name()variable_nameCONSTANT_NAME_private_var_internal_global__secret_varclass MyClass:
def __init__(self):
# Public attribute
self.public_var: str = "visible"
# Protected attribute (convention only)
self._protected_var: str = "use with care"
# Private attribute (name mangled to _MyClass__secret)
self.__secret: str = "truly private"# Good
from absl import flags
from doctor.who import jodie
# Bad
import jodie # Ambiguous"""def fetch_smalltable_rows(
table_handle: smalltable.Table,
keys: Sequence[bytes | str],
require_all_keys: bool = False,
) -> Mapping[bytes, tuple[str, ...]]:
"""Fetches rows from a Smalltable.
Retrieves rows pertaining to the given keys from the Table instance
represented by table_handle. String keys will be UTF-8 encoded.
Args:
table_handle: An open smalltable.Table instance.
keys: A sequence of strings representing the key of each table
row to fetch. String keys will be UTF-8 encoded.
require_all_keys: If True only rows with values set for all keys will be
returned.
Returns:
A dict mapping keys to the corresponding table row data
fetched. Each row is represented as a tuple of strings. For
example:
{b'Serak': ('Rigel VII', 'Preparer'),
b'Zim': ('Irk', 'Invader'),
b'Lrrr': ('Omicron Persei 8', 'Emperor')}
Returned keys are always bytes. If a key from the keys argument is
missing from the dictionary, then that row was not found in the
table (and require_all_keys must have been False).
Raises:
IOError: An error occurred accessing the smalltable.
"""class SampleClass:
"""Summary of class here.
Longer class information...
Longer class information...
Attributes:
likes_spam: A boolean indicating if we like SPAM or not.
eggs: An integer count of the eggs we have laid.
"""
def __init__(self, likes_spam: bool = False):
"""Initializes the instance based on spam preference.
Args:
likes_spam: Defines if instance exhibits this preference.
"""
self.likes_spam = likes_spam
self.eggs = 0"""A one-line summary of the module or program, terminated by a period.
Leave one blank line. The rest of this docstring should contain an
overall description of the module or program. Optionally, it may also
contain a brief description of exported classes and functions and/or usage
examples.
Typical usage example:
foo = ClassFoo()
bar = foo.function_bar()
"""def func(a: int) -> list[int]:
return [a * 2]
# For variables when type isn't obvious
a: SomeType = some_func()
# Use modern syntax (Python 3.10+)
def process(data: str | None = None) -> dict[str, int]:
passtypingfrom typing import Dict, List, Set, Tuple, Optional
# Good - using typing module
def process_users(users: List[str]) -> Dict[str, int]:
return {user: len(user) for user in users}
def get_config() -> Dict[str, List[int]]:
return {"ports": [8080, 8081]}
# Good - with Optional
def find_user(user_id: int) -> Optional[str]:
return None
# Bad - using built-in lowercase types (avoid)
def process_users(users: list[str]) -> dict[str, int]:
return {user: len(user) for user in users}listdicttypingListDict# Good
foo_bar(
self, width, height, color='black', design=None, x='foo',
emphasis=None, highlight=0
)
# Good
if (width == 0 and height == 0 and
color == 'red' and emphasis == 'strong'):
pass
# Bad - backslash continuation
if width == 0 and height == 0 and \
color == 'red' and emphasis == 'strong':
pass# Good
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:
raise ValueError(f'Min. port must be at least 1024, not {minimum}.')
port = self._find_next_port(minimum)
if port is None:
raise ConnectionError(
f'Could not connect to service on port {minimum} or higher.')
return port# Good
def foo(a, b: list[int] | None = None):
if b is None:
b = []
# Bad
def foo(a, b: list[int] = []):
pass# Good
if not users:
print('no users')
if foo:
bar()
# Check for None explicitly
if x is None:
pass
# Bad
if len(users) == 0:
print('no users')
if foo != []:
bar()# Good
result = [mapping_expr for value in iterable if filter_expr]
# Good
result = [
is_valid(metric={'key': value})
for value in interesting_iterable
if a_longer_filter_expression(value)
]
# Bad - multiple for clauses
result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]# Good - using underscore when variable is not used
for _user in users:
print("Processing a user")
send_notification()
for _item in items:
count += 1
# Good - using the variable
for user in users:
print(f"Processing {user.name}")
user.process()
# Bad - not using underscore when variable is unused
for user in users: # 'user' is never referenced
print("Processing a user")pylintdef do_PUT(self): # WSGI name, so pylint: disable=invalid-name
passimport this