PyCharm警告'不可调用

7 投票
2 回答
8955 浏览
提问于 2025-04-18 14:23

我写了一个规则引擎,里面有一个参数叫做'matcher',这个参数可以是一个字符串、一个正则表达式,或者一个函数。

当我测试和使用这个'matcher'的时候:

    if hasattr(self.matcher, '__call__'):  # 函数
        match_this_rule = self.matcher(input_msg)

PyCharm在第二行给我发了个警告,提示说'matcher不可调用'。

我该怎么做才能让PyCharm不再显示这个警告呢?

2 个回答

1

使用 typing 这个模块,这样PyCharm就能明白你在用什么类型的对象。

可以像这样写:

class TestClass:
    matcher: Type[ClassObject] = ClassInstance

或者这样:

if hasattr(self.matcher: Type[ClassObject], '__call__'):  # 函数
    match_this_rule = self.matcher(input_msg)
11

PyCharm 这个工具一般来说无法判断你的 self.matcher 是否可以被调用。对 PyCharm 来说,你只是测试这个对象是否有某个属性,但我怀疑 PyCharm 能否识别这个属性名是固定的,并且这个条件意味着这个对象是可以被调用的。

要改变 PyCharm 的这种行为,唯一的办法就是关闭对那条语句的检查。

if hasattr(self.matcher, '__call__'):
    # noinspection PyCallingNonCallable
    match_this_rule = self.matcher(input_msg)

与其用你自己写的测试,不如使用内置的 callable 函数:

if callable(self.matcher):
    match_this_rule = self.matcher(input_msg)

实际上,在 PyCharm 3.4 版本中,上面的代码不会触发警告,因为 PyCharm 能识别内置的 callable 函数。


不过,更好的做法是避免为你的 matcher 使用三种不同的类型。你可以把非函数类型的 matcher 包装成一个函数,或者创建一个小类来以统一的方式进行匹配。这样也能简化代码,因为你就不需要不断测试类型来使用 self.matcher 了。

撰写回答