# Python Coding Convention

> Got curious about PEP8, so I looked it up and decided to organize it
>
> References: \[Book] Effective Python

\ <br>

## What is PEP8?

> Python Enhancement Proposal 8 (PEP8)

* A style guide that tells you how to organize Python code
  * An agreement to write code in a specific format
    * Using a consistent style makes **maintenance** easier and improves **readability**!
* Detailed information is available at [python.org](https://www.python.org/dev/peps/pep-0008/)!

\ <br>

## Some Rules from PEP8 That Must Be Followed

<br>

### 1. Whitespace

> In Python, whitespace is syntactically significant
>
> Python programmers are particularly sensitive to the impact of whitespace because of code clarity!

* Indent with **spaces**, not tabs
* Use **4 spaces** for each level of syntactically significant indentation
* Each line should be **79 characters** or less
* When an expression continues to the next line, use **4 additional spaces** beyond the normal indentation level
* `Functions` and `classes` in a file should be separated by **two blank lines**
* Methods within a Class should be separated by a single blank line
* Do **not use spaces** around `list indices`, `function calls`, or `keyword argument assignments`

<br>

### 2. Naming Conventions

> PEP 8 suggests unique naming conventions for different parts of the language
>
> This makes it easy to distinguish the type corresponding to each name when reading code!

* `Functions`, `variables`, and `attributes` follow the **lowercase\_underscore** format
* `Protected` instance attributes follow the **\_leading\_underscore** format
* `Private` instance attributes follow the **\_\_double\_leading\_underscore** format
* Classes and Exceptions follow the **CapitalizedWord** format
* Module-level constants follow the **ALL\_CAPS** format
* The first parameter of a `Class instance` method (which references the object) should be named **self**
* The first parameter of a `Class method` (which references the class) should be named **cls**

<br>

### 3. Expressions and Statements

> The Zen of Python states: "There should be one-- and preferably only one --obvious way to do it"
>
> PEP 8 codifies this style as the standard for expressions and statements

* Use inline negation (`if a is not b`) instead of negation of positive expressions (`if not a is b`)
* Don't check for empty values (`[]` or `''`) by checking the length (`if len(somelist) == 0`)
  * Use `if not somelist` and assume that empty values are implicitly **False**
  * The same approach applies to non-empty values!
    * Non-empty values will make `if somelist` implicitly **True**
* Don't write single-line `if statements`, `for and while loops`, or `except compound statements`
  * Write these statements on multiple lines for clarity!
* Always place import statements at the top of the file
* When **importing modules**, always use the module's absolute name; do not use relative path names based on the current module's path
  * ex) Use `from bar import foo` instead of just `import foo`!
* If you must use relative imports, use explicit syntax: `from . import foo`
* Imports should be organized in the order of `standard library modules`, `third-party modules`, and `your own modules`
  * Within each subsection, import in alphabetical order

\ <br>

## How to Check If You're Following PEP8

> Install and use pylint and PEP8!

<br>

### 1. pylint

```bash
$ pip install pylint
```

<br>

### 2. PEP8

```bash
$ pip install pep8
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://chloe-codes1.gitbook.io/til/python/python-101/python_coding_convention.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
