Reputation: 6808
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
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