This document contains some anti-patterns that have either been discussed during code-reviews or noticed by some one when refactoring any of GN's code-base. Use these "ideas" as a reference, and apply reasonable judgement depending on what you are working on.
Consider:
from typing import List _l = ['a', 'b', 'c'] def add_pvalue(l: List, val: str) -> List: l.append(val) return l print(f"{_l=}\n") print(f"{add_pvalue(_l, 'd')=}\n") print(f"{_l=}")
which outputs (note that _l in the global scope has changed):
_l=['a', 'b', 'c'] add_pvalue(_l, 'd')=['a', 'b', 'c', 'd'] _l=['a', 'b', 'c', 'd']
A better fix would be:
from typing import List _l = ['a', 'b', 'c'] def add_pvalue(l: List, val: str) -> List: l = l.copy() l.append(val) return l print(f"{_l=}\n") print(f"{add_pvalue(_l, 'd')=}\n") print(f"{_l=}")
which now does the right thing:
_l=['a', 'b', 'c'] add_pvalue(_l, 'd')=['a', 'b', 'c', 'd'] _l=['a', 'b', 'c']
Best, use immutable types:
from typing import Tuple _l = ['a', 'b', 'c'] def add_pvalue(l: Tuple, val: str) -> Tuple: return l + (val,) print(f"{_l=}\n") print(f"{add_pvalue(tuple(_l), 'p')=}\n") print(f"{_l=}")
which outputs:
_l=['a', 'b', 'c'] add_pvalue(tuple(_l), 'p')=('a', 'b', 'c', 'p') _l=['a', 'b', 'c']