pepoluan
pepoluan

Reputation: 6808

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)

Upvotes: 10

Views: 2875

Answers (1)

pepoluan
pepoluan

Reputation: 6808

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...

Upvotes: 3

Related Questions