PyCharm。意外参数可能的被调用者

PyCharm. Unexpected argument(s) Possible callees

我在 PyCharm 中写入并得到一个错误(在行“func(dict_data)”):意外参数可能的被调用者:A.foo(dict_data: 字典) A.bar(dict_data: 字典).

这是 PyCharm 错误还是我做错了什么?

PyCharm 2020.3

    class A:
    
        def __init__(self):
            self.functions = {
                "foo": self.foo,
                "bar": self.bar
            }
    
        def typing(self, dict_data: dict):
            for key, value in dict_data.items():
                if key in self.functions:
                    func = self.functions[value["type"]]
                    func(dict_data)
    
        def foo(self, dict_data: dict):
            print(dict_data)
    
        def bar(self, dict_data: dict):
            print(dict_data)
    
    
    class B:
    
        def __init__(self):
            self.data = {
                "foo": {"type": "foo"},
                "bar": {"type": "bar"}
            }
    
        def get(self) -> dict:
            return self.data
    
    
    if __name__ == "__main__":
    
        b = B()
        data = b.get()
        a = A()
        a.typing(data)

func 实际上是您代码中的一个变量,但您将其作为一个不存在的函数调用,因此 PyCharm 猜测您可能想使用哪个函数来代替 dict_data 作为参数。

1

图片中的 'def function_name(arguments : datatype)' 是函数的识别方式,但您的 ss 具有关键字 'Union',因此 func 的数据类型是 Union。

您可以通过添加 lambda 来消除警告:

self.functions = {
                "foo": lambda x: self.foo,
                "bar": lambda x: self.bar
            }

更好的方法是向 func 添加类型提示,例如

func: Callable[[dict], None] = self.functions[value["type"]]

(别忘了加上from typing import Callable

这将通过提供附加信息以正确确定类型来消除 IDE 警告。基本上,它将不再将 func 视为 Union 类型,而是直接知道它是 Callable 已知方法签名。