How to type hint a "float-like" object? #2038
-
How do I make type hint for a function, which takes any kind for object that behaves like a float? def cubed(x):
return x**3 This function can accept a float ( pandas series: s = pd.Series([1,2,3])
cubed(s) xarray dataarray a = xr.DataArray([1, 2, 3], dims='x')
cubed(a) |
Beta Was this translation helpful? Give feedback.
Replies: 5 comments
-
Depending on how precise you want to be, something like numpy's In the future, questions like this should generally be asked in the discussions tab or at https://discuss.python.org/c/help/7 |
Beta Was this translation helpful? Give feedback.
-
Hmm, but ArrayLike is kind of opposite, right? This is for objects that have array-like behaviour (which includes a scalar instance of a float). What I am looking at, are objects that have a float-like behaviour (which includes arrays of floats). Does that make sense? I was wondering if the was some kind of FloatLike (or maybe more mathematically correct: a RealNumberLike) protocol in Sorry for asking in the wrong place; I was too hastly there. I can move the discussion to there, if you like :-) |
Beta Was this translation helpful? Give feedback.
-
You might want to use a protocol with a |
Beta Was this translation helpful? Give feedback.
-
Hmm, I would suggest that "float-like" means it supports all the methods of the builtin float object defined here. So I guess a Protocol with these method would suffice maybe? Could this be part of |
Beta Was this translation helpful? Give feedback.
-
Whether it suffices or not really depends on your code. I would probably find it surprising if the thing you're thinking of as float-like actually returns float for some of those methods. Try it and see, your type checker should tell if you if your Protocol has things your type doesn't satisfy or if you use things not described by your Protocol!
There's a high bar for adding things to the standard library, particularly when they can easily be defined outside the standard library and haven't yet been evidenced to be highly desired. |
Beta Was this translation helpful? Give feedback.
You might want to use a protocol with a
__pow__
method (since the**
operator calls__pow__
). Search fortyping.Protocol
for more. There are many things "float-like" could mean but a Protocol should generally be able to express them.