我想完全输入我的Python项目。但是我被一个可以用不同参数调用的构造函数困住了。你知道吗
我试着从最终的构造函数中删除类型,我试着删除一些构造函数。。。但还是有同样的问题。你知道吗
class PageObject(ABC):
logger = logging.getLogger(__name__)
@overload
def __init__(self, driver: Driver) -> None:
...
@overload
def __init__(self, by: Tuple[By, str], driver: Driver) -> None:
...
@overload
def __init__(self, context: WebElement, driver: Driver) -> None:
...
@overload
def __init__(self, by: Tuple[By, str], parent: "PageObject") -> None:
...
@overload
def __init__(self, parent: "PageObject") -> None:
...
def __init__(
self,
by: Optional[Tuple[By, str]] = None,
context: Optional[WebElement] = None,
parent: Optional["PageObject"] = None,
driver: Optional[Driver] = None,
) -> None:
if by and context:
raise ValueError("You cannot provide a locator AND a context.")
# ...
运行mypy时出现以下错误:
基本/页面_对象。py:36:错误:重载函数实现不接受签名1的所有可能参数
基本/页面_对象。py:36:错误:重载函数实现不接受签名2的所有可能参数
基本/页面_对象。py:36:错误:重载函数实现不接受签名3的所有可能参数
基本/页面_对象。py:36:错误:重载函数实现不接受签名4的所有可能参数
基本/页面_对象。py:36:错误:重载函数实现不接受签名5的所有可能参数
问题来了。假设有人尝试运行
PageObject(Driver())
,也就是说,我们传入一个Driver
对象作为第一个参数。你知道吗这与您的第一个重载匹配,因此将由mypy进行类型检查。但在运行时到底发生了什么?第一个运行时参数是
by
,因此Driver
对象被分配给by
,而不是driver
。所以现在类型之间存在不匹配,因为by
应该是Optional[Tuple[By, str]]
类型。你知道吗可能最简单的解决方法是禁止用户同时使用位置参数和mandate that they use only keyword arguments。你可以这样做:
现在,mypy typecheck没有错误,而执行
PageObject(Driver())
被mypy和Python视为错误。相反,您现在需要执行PageObject(driver=Driver())
。你知道吗如果您想允许位置参数,恐怕需要重新设计代码。也许您可以考虑使用staticmethods或classmethods之类的方法,这样您就可以拥有不同的构造函数“风格”,基本上就是注释中建议的工厂模式。你知道吗
相关问题 更多 >
编程相关推荐