59 lines
1.3 KiB
Python
59 lines
1.3 KiB
Python
"""
|
|
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
|