gpt4 book ai didi

python /MyPy : How to annotate a method that can return one of several different types of objects?

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:44 25 4
gpt4 key购买 nike

一个可以返回多个不同类型对象的方法,应该如何注解返回类型?

具体来说,这是我遇到问题的方法:

def _bin_factory(self) -> Any:
"""
Returns a bin with the specificed algorithm,
heuristic, and dimensions
"""
if self.algorithm == 'guillotine':
return guillotine.Guillotine(self.bin_width, self.bin_height, self.rotation,
self.rectangle_merge, self.split_heuristic)
elif self.algorithm == 'shelf':
return shelf.Sheet(self.bin_width, self.bin_height, self.rotation, self.wastemap)
elif self.algorithm == 'maximal_rectangle':
return maximal_rectangles.MaximalRectangle(self.bin_width, self.bin_height, self.rotation)
raise ValueError('Error: No such Algorithm')

我尝试了 Union[shelf.Sheet, guillotine.Guillotine, maximal_rectangles.MaximalRectangle] 但是 MyPy 给了我很多错误,我稍后在我的代码中使用了 _bin_factory 方法。这些错误似乎都围绕着这样一个事实,即 Union 中的所有三种对象类型都具有彼此不同的属性。

最佳答案

这是一个使用 typing.Generic 的解决方案

from typing import Generic, TypeVar

T = TypeVar('T', 'Guillotine', 'Sheet', 'MaximalRectangle')

class Guillotine:
pass

class Sheet:
pass

class MaximalRectangle:
pass

class Algo(Generic[T]):
def __init__(self, algorithm: str) -> None:
self.algorithm = algorithm

def _bin_factory(self) -> T:
"""
Returns a bin with the specificed algorithm,
heuristic, and dimensions
"""
if self.algorithm == 'guillotine':
return Guillotine() # type: ignore
elif self.algorithm == 'shelf':
return Sheet() # type: ignore
elif self.algorithm == 'maximal_rectangle':
return MaximalRectangle() # type: ignore
raise ValueError('Error: No such Algorithm')


algo: Algo[Guillotine] = Algo('guillotine')
reveal_type(algo._bin_factory())

或者,如果您愿意更多地修改您的方法,您可以提供一个更简洁的 API:

from typing import Generic, TypeVar, Type

T = TypeVar('T', 'Guillotine', 'Sheet', 'MaximalRectangle')

class Guillotine:
pass

class Sheet:
pass

class MaximalRectangle:
pass

class Algo(Generic[T]):
def __init__(self, algorithm: Type[T]) -> None:
self.algorithm = algorithm # type: Type[T]

def _bin_factory(self) -> T:
"""
Returns a bin with the specificed algorithm,
heuristic, and dimensions
"""
if self.algorithm is Guillotine:
# handle custom arguments:
return self.algorithm()
elif self.algorithm is Sheet:
# handle custom arguments:
return self.algorithm()
elif self.algorithm is MaximalRectangle:
# handle custom arguments:
return self.algorithm()
raise ValueError('Error: No such Algorithm')

algo = Algo(Guillotine)
reveal_type(algo._bin_factory())

关于 python /MyPy : How to annotate a method that can return one of several different types of objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47119364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com