| ▲ | voidUpdate 2 hours ago | |||||||||||||||||||||||||||||||
> "In Python, any method __eq__ is expected to return bool, and if it doesn't, then we need to explicitly tell type-checkers to ignore the type error. This function in Polars can also return different types depending on the inputs, thus requiring overloads." Why would you ever want a == b to not return a bool?? EDIT: Yes, I understand that you can do element-wise equality checks on numpy arrays now | ||||||||||||||||||||||||||||||||
| ▲ | vitamark 2 hours ago | parent | next [-] | |||||||||||||||||||||||||||||||
There are examples like ORM query builders (something like `User.id == user_id` should not return a boolean, but rather some inspectable query part), multi-value comparisons (e.g. numpy arrays and views which could also be used as masks for indexing) In general, when you get your hands on operator overloading you get a bunch of various quirky applications for each. Some dunder methods have strict runtime-level rules (e.g. __hash__ or __len__), some don't | ||||||||||||||||||||||||||||||||
| ▲ | samsartor 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||
Elementwise equality! Given two dataframe columns or ndarrays, users often expect `==` to give out a column or ndarrays of bools (like `+`, ``, `*, `&`, and just about every other binary operator). | ||||||||||||||||||||||||||||||||
| ▲ | olooney 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||
It could return a vector or a deferred expression? In polars, for example, operations on `pl.col` return `Expr` objects that are used to build queries, not immediately evaluated:
In numpy, `x == y` return a boolean vector of the same shape as x and y, comparing them element-wise. | ||||||||||||||||||||||||||||||||
| ▲ | datsci_est_2015 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||
One example is if an and b are arrays (e.g. numpy arrays) it’s not unreasonable for dunder eq to return an array of booleans. Another example might be if you have a domain specific representation of equality (e.g. class Equality) | ||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||
| ▲ | kuschku 41 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||
Primarily, because Python doesn't have quasi-quoting. You can't pass an expression without workarounds like this. | ||||||||||||||||||||||||||||||||
| ▲ | xemdetia 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||
I thought JavaScript language equality quirks was seen as problematic not a missing feature in Python. | ||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||
| ▲ | throwaway894345 an hour ago | parent | prev [-] | |||||||||||||||||||||||||||||||
IIRC, SQLAlchemy overloads this to return an object that represents an equality check in SQL. Because it was returning an object, it was always evaluating to True, because of another of Python’s footguns: truthiness/falsiness. This was a decade ago, and these particular footguns were not even remotely the biggest culprits in our bug backlogs (another honorable mention includes accidentally calling a sync function in an async context, causing timeouts in unrelated endpoints and leading to cascading system failure). | ||||||||||||||||||||||||||||||||