Skip to content

Latest commit

 

History

History
79 lines (57 loc) · 2.36 KB

File metadata and controls

79 lines (57 loc) · 2.36 KB

Python at the CPG

The CPG is mostly a Python shop! We strongly recommend using virtual environments (over conda) to manage Python.

We try to stay relatively up-to-date, most of our tools use Python 3.11 (with a few rare 3.8 exceptions), some are using 3.10 or 3.12. This can be super confusing!

Managing Python versions

We strongly recommend using pyenv to manage versions of Python. This makes it really easy to install and manage multiple versions:

brew install pyenv

You will need to run the following to set up pyenv on zsh. Make sure to source the .zshrc file before running pyenv in the next step:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
pyenv install 3.11.12
pyenv global 3.11.12

Named virtual environments

If you like named virtual environments (rather than many env/ directories in your repos), take inspiration from this snippet you could add to your .zshrc file:

export VIRTUALENV_DIR="$HOME/.venv"

if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

function venv() {
  if test -f "$VIRTUALENV_DIR/$@/bin/activate"; then
    source $VIRTUALENV_DIR/$@/bin/activate
  else
    # have to use (pyenv which python3) otherwise old conda could take over
    virtualenv -p $(pyenv which python3) $VIRTUALENV_DIR/$@/ && source $VIRTUALENV_DIR/$@/bin/activate
  fi
}
function activate() {
  source $VIRTUALENV_DIR/$@/bin/activate
}
alias venvlist="ls $VIRTUALENV_DIR && echo 'You can activate one of these virtualenvs with: activate <env>'"

# allow autocomplete of `activate <name>`
_activate_completion() {
    local cur_word="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=($(compgen -W "$(ls $VIRTUALENV_DIR | grep "^$cur_word")" -- "$cur_word"))
}
complete -F _activate_completion activate

Typing

Since the release of PEP 604 in Python 3.10, we are able to use type annotations such as:

x: str | None = None

which is preferred over:

from typing import Optional
x: Optional[str] = None

due to some caveats with the use of Optional but also to keep the codebase simpler, and less reliant on the use of additional modules.

Visual Studio Code

See Code editors for more information on configuring Python in VSCode.