解决mypy与Pylance对返回Callable的函数的报错问题
问题原因及解决办法
原因
- 你搞错了
@property装饰器的用法:被@property装饰的方法是当作属性来访问的,不需要加括号调用。你的aggregator被@property和@abstractmethod装饰后,self.aggregator直接返回Callable[[Column], Column]类型的函数。而你写的self.aggregator()相当于把这个返回的函数又调用了一次——但这个函数必须接收一个Column类型的参数,你没传,所以mypy和Pylance会提示参数不足。 - 测试能运行是因为Python的动态特性掩盖了这个问题,但静态类型检查器会严格按类型注解校验,所以报错。
解决办法
把aggregator后面的括号去掉,正确的调用代码是:
return self.aggregator(self.columnExpression()).alias(self.feature_name)
对应代码示例
你的抽象基类定义大概是这样的,修正后就能通过类型检查:
from abc import ABC, abstractmethod from typing import Callable # 假设Column是你使用的列类型,比如pyspark.sql.Column from pyspark.sql import Column class Feature(ABC): @property @abstractmethod def aggregator(self) -> Callable[[Column], Column]: pass @property def column(self): # 修正前错误写法:self.aggregator()(self.columnExpression()) return self.aggregator(self.columnExpression()).alias(self.feature_name) @abstractmethod def columnExpression(self) -> Column: pass @property @abstractmethod def feature_name(self) -> str: pass
这样修改后,静态类型检查器会识别出self.aggregator就是需要的可调用函数,传入columnExpression()的结果刚好符合参数要求,不会再报错。
内容的提问来源于stack exchange,提问作者jamiet
相关产品推荐
相关产品推荐

