mirror of
https://github.com/pybind/pybind11.git
synced 2026-05-24 14:55:01 +00:00
Fix /= operator under Python 3
The Python method for /= was set as `__idiv__`, which should be `__itruediv__` under Python 3. This wasn't totally broken in that without it defined, Python constructs a new object by calling __truediv__. The operator tests, however, didn't actually test the /= operator: when I added it, I saw an extra construction, leading to the problem. This commit also includes tests for the previously untested *= operator, and adds some element-wise vector multiplication and division operators.
This commit is contained in:
@@ -25,7 +25,7 @@ enum op_id : int {
|
||||
op_int, op_long, op_float, op_str, op_cmp, op_gt, op_ge, op_lt, op_le,
|
||||
op_eq, op_ne, op_iadd, op_isub, op_imul, op_idiv, op_imod, op_ilshift,
|
||||
op_irshift, op_iand, op_ixor, op_ior, op_complex, op_bool, op_nonzero,
|
||||
op_repr, op_truediv
|
||||
op_repr, op_truediv, op_itruediv
|
||||
};
|
||||
|
||||
enum op_type : int {
|
||||
@@ -129,7 +129,11 @@ PYBIND11_BINARY_OPERATOR(le, ge, operator<=, l <= r)
|
||||
PYBIND11_INPLACE_OPERATOR(iadd, operator+=, l += r)
|
||||
PYBIND11_INPLACE_OPERATOR(isub, operator-=, l -= r)
|
||||
PYBIND11_INPLACE_OPERATOR(imul, operator*=, l *= r)
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
PYBIND11_INPLACE_OPERATOR(itruediv, operator/=, l /= r)
|
||||
#else
|
||||
PYBIND11_INPLACE_OPERATOR(idiv, operator/=, l /= r)
|
||||
#endif
|
||||
PYBIND11_INPLACE_OPERATOR(imod, operator%=, l %= r)
|
||||
PYBIND11_INPLACE_OPERATOR(ilshift, operator<<=, l <<= r)
|
||||
PYBIND11_INPLACE_OPERATOR(irshift, operator>>=, l >>= r)
|
||||
|
||||
Reference in New Issue
Block a user