Skip to content

How to type hint a "float-like" object? #2037

Closed

Description

@UlrikChristensenGit

How do I make type hint for a function, which takes any kind for object that behaves like a float?
For example, consider

def cubed(x):
    return x**3

This function can accept a float (f(5)), but also any other kind of object which supports the same operations as float:

pandas series:

s = pd.Series([1,2,3])
cubed(s)

xarray dataarray

a = xr.DataArray([1, 2, 3], dims='x')
cubed(a)

Activity

  1. brianschubert commented on Jul 1, 2025

    @brianschubert
    Contributor

    Depending on how precise you want to be, something like numpy's ArrayLike or a custom SupportsPow protocol (example) may be what you're looking for.

    In the future, questions like this should generally be asked in the discussions tab or at https://discuss.python.org/c/help/7

  2. UlrikChristensenGit commented on Jul 1, 2025

    @UlrikChristensenGit
    Author

    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 typing, but I can't really seem to find something like this.

    Sorry for asking in the wrong place; I was too hastly there. I can move the discussion to there, if you like :-)

  3. JelleZijlstra commented on Jul 1, 2025

    @JelleZijlstra
    Member

    You might want to use a protocol with a __pow__ method (since the ** operator calls __pow__). Search for typing.Protocol for more. There are many things "float-like" could mean but a Protocol should generally be able to express them.

  4. UlrikChristensenGit commented on Jul 2, 2025

    @UlrikChristensenGit
    Author

    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 typing?

  5. hauntsaninja commented on Jul 2, 2025

    @hauntsaninja
    Collaborator

    So I guess a Protocol with these method would suffice maybe?

    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!

    Could this be part of typing?

    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.

  6. locked and limited conversation to collaborators on Jul 2, 2025
  7. converted this issue into a discussion #2038 on Jul 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: otherOther topics not covered

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions