Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重载以下可选参数_Python_Mypy_Static Typing - Fatal编程技术网

Python 重载以下可选参数

Python 重载以下可选参数,python,mypy,static-typing,Python,Mypy,Static Typing,我有一个类Animal,它有一个方法foo,根据可选参数bar后面的布尔参数inplace有不同的返回类型。我希望重载该函数,以便在inplace的值已知时,返回类型已知 这是我的密码: #main.py 从未来导入注释 从键入导入可选、重载、文本 动物类别: @超载 def foo(self,bar=…,inplace:Literal[False]=…)->Animal: ... @超载 def foo(self,bar=…,inplace:Literal[True]=…)->None: ..

我有一个类
Animal
,它有一个方法
foo
,根据可选参数
bar
后面的布尔参数
inplace
有不同的返回类型。我希望重载该函数,以便在
inplace
的值已知时,返回类型已知

这是我的密码:

#main.py
从未来导入注释
从键入导入可选、重载、文本
动物类别:
@超载
def foo(self,bar=…,inplace:Literal[False]=…)->Animal:
...
@超载
def foo(self,bar=…,inplace:Literal[True]=…)->None:
...
德福(
self,bar=None,inplace:bool=False
)->可选[动物]:
...
显示类型(Animal().foo(bar='a'))
显示类型(动物().foo(inplace=True))
显示类型(Animal().foo(inplace=False))

如何避免重载函数签名1和2与第8行的不兼容返回类型重叠错误?

尝试:

@overload
def foo(self, inplace: Literal[False]=..., bar=...) -> Animal:
    ...

@overload
def foo(self, inplace: Literal[True], bar=...,) -> None:
    ...

def foo(self, inplace=False, bar=None):
    ...
我更改了args的顺序,否则第二次重载将不正确。

这似乎有效:

from\uuuuu future\uuuuu导入注释
从键入导入可选、重载、文本
动物类别:
#使用默认值
@超载
def foo(self,bar=…,inplace:Literal[False]=…)->Animal:。。。
#使用就地=真
#带酒吧
@超载
def foo(self、bar、inplace:Literal[True])->None:。。。
#无栏
@超载
def foo(self,*,inplace:Literal[True])->None:。。。
#与布尔
@超载
def foo(self,bar=…,inplace:bool=…)->可选的[动物]:。。。
德福(
self,bar=None,inplace=False
):
...
显示类型(Animal().foo(bar='a'))
显示类型(Animal().foo(bar='a',inplace=True))
显示类型(Animal().foo(bar='a',inplace=False))
显示类型(动物().foo(inplace=True))
显示类型(Animal().foo(inplace=False))
显示类型(动物().foo())
原地:布尔
显示类型(动物().foo(bar='a',inplace=inplace))
显示类型(动物().foo(原地=原地))

很多重载,但这在这里可能是不可避免的

我无法更改
def foo
中参数的顺序,恐怕这将是一个突破性的更改
@overload
def foo(self, inplace: Literal[False]=..., bar=...) -> Animal:
    ...

@overload
def foo(self, inplace: Literal[True], bar=...,) -> None:
    ...

def foo(self, inplace=False, bar=None):
    ...