Style Guide#
TypeVar
names#
Use _{}T
for invariant TypeVar
names, where {}
is a concise human-readable description of the upper bound. Use a *_co
or *_contra
suffix to indicate co- or contra-variance.
Yes | No |
---|---|
_T_co | T_co |
_ScalarT | _SCT |
_DTypeT | _DType |
Protocol names#
Use Can{}
for Protocol
types with a single method, where {}
is the CamelCase name of that method. This naming convention was originally introduced by jorenham/optype, and has been gaining popularity since. Note that this deviates from Supports{}
from Python style guide for stubs, which is arguably more verbose and less descriptive.
In line with both optype
and the stub style guide, NumType also uses Has{}
for single-attribute protocols, with {}
the CamelCase attribute name.
Protocol member | Yes | No |
---|---|---|
__len__() | CanLen | Sized |
__fspath__() | CanFSPath | PathLike |
fileno() | CanFileno | HasFileno |
dtype | HasDType | DTypeLike |
Newlines between overloaded functions#
The ruff formatter tends to remove all whitespace between all functions. But for overloaded functions this is often bad for readability. To get around this, place a \n\n#\n
between first overload definition. For non-overloaded functions this should only be done to separate semantically different groups of functions. For an example, see src/numpy-stubs/lib/_type_check_impl.pyi
:
@overload
def iscomplex(x: ToGeneric_0d) -> np.bool: ...
@overload
def iscomplex(x: ToGeneric_1nd) -> Array[np.bool]: ...
#
@overload
def isreal(x: ToGeneric_0d) -> np.bool: ...
@overload
def isreal(x: ToGeneric_1nd) -> Array[np.bool]: ...
#
def iscomplexobj(x: _HasDType[Any] | ToGeneric_nd) -> bool: ...
def isrealobj(x: _HasDType[Any] | ToGeneric_nd) -> bool: ...
Max line length#
For .py
files the lines must not exceed 88 characters in width, compatible with the black style.
For .pyi
stubs, a maximum line length of 120 characters applies. Note that this is different from the Python stub style guide, which recommends 130. There are several reasons for this choice:
- The github diff viewer supports at most 125 characters.
- In general, 120 is used far more often than 130 as character limit.