12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- """
- Templates for invalid operations.
- """
- from __future__ import annotations
- import operator
- import numpy as np
- def invalid_comparison(left, right, op) -> np.ndarray:
- """
- If a comparison has mismatched types and is not necessarily meaningful,
- follow python3 conventions by:
- - returning all-False for equality
- - returning all-True for inequality
- - raising TypeError otherwise
- Parameters
- ----------
- left : array-like
- right : scalar, array-like
- op : operator.{eq, ne, lt, le, gt}
- Raises
- ------
- TypeError : on inequality comparisons
- """
- if op is operator.eq:
- res_values = np.zeros(left.shape, dtype=bool)
- elif op is operator.ne:
- res_values = np.ones(left.shape, dtype=bool)
- else:
- typ = type(right).__name__
- raise TypeError(f"Invalid comparison between dtype={left.dtype} and {typ}")
- return res_values
- def make_invalid_op(name: str):
- """
- Return a binary method that always raises a TypeError.
- Parameters
- ----------
- name : str
- Returns
- -------
- invalid_op : function
- """
- def invalid_op(self, other=None):
- typ = type(self).__name__
- raise TypeError(f"cannot perform {name} with this index type: {typ}")
- invalid_op.__name__ = name
- return invalid_op
|