PyCharm警告'不可调用
我写了一个规则引擎,里面有一个参数叫做'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
了。