Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python typing: How to type-hint a variable as a bound method?

So I have a function (let's call it fun1) that accepts a function as a parameter. But inside fun1, I need to access the parameter's __self__, which exists only if the function is a bound method.

The function itself must accept two str args and return a bool.

In other words, like this:

MyFuncType = Callable[[str, str], bool]

# fun1 is an unbound function
def fun1(func: MyFuncType):
    ...
    o = func.__self__
    ...
    # Some logic on the "o" object, such as logging the object's class,
    # doing some inspection, etc.
    ...

If I use MyFuncType like the above, PyCharm will complain that __self__ is not an attribute of func.

So, what type hint should I annotate func with, so that PyCharm (and possibly mypy) won't protest on that line?

(I'm using Python 3.6 by the way)

like image 672
pepoluan Avatar asked May 03 '26 07:05

pepoluan


1 Answers

Okay after some experimentation, I settle with this:

class BoundFunc:
    __self__: object

MyFuncType = Callable[[str, str], bool]
MyBoundFuncType = Union[MyFuncType, BoundFunc]

def fun1(func: MyBoundFuncType):
    ...
    o = func.__self__
    ...

This does NOT warn me if I pass an unbound function to fun1, but at least it suppresses PyCharm's warning when I try to access the __self__ property.

I figure a proper docstring on fun1 explicitly saying that func MUST be a bound method should be enough for adults...

like image 143
pepoluan Avatar answered May 05 '26 13:05

pepoluan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!