我已经开始在应用程序上测试mypy,但在尝试使用instances of class
时我没有成功。
ButtonGenerator.__new__
应接受BaseButton
(URLButton
)或BaseButton
(URLButton
)实例的列表。
buttons.py
class BaseButton(object):
def __init__(self):
pass
class ButtonGenerator(BaseButton):
def __new__(self, buttons: Union[List[BaseButton], BaseButton]) -> Union[List[Dict[str, str]], Dict[str, str]]:
if (isinstance(buttons, list)):
if (not all(isinstance(button, BaseButton) for button in buttons)):
raise ValueError('Invalid Buttons instances.')
return [button.button_dict for button in buttons]
return buttons.button_dict
class URLButton(BaseButton):
def __init__(self, url, title=None):
self.button_dict = {
'type': 'web_url',
'url': url
}
if (title):
self.button_dict['title'] = title
错误
messenger/buttons.py:17: error: "BaseButton" has no attribute "button_dict"
messenger/buttons.py:19: error: "BaseButton" has no attribute "button_dict"
实施例:
print(ButtonGenerator(URLButton('https://stackoverflow.com')))
我也尝试使用Callable
列表。
答案 0 :(得分:0)
如果mypy尝试返回隐式类型以外的其他类型,则mypy目前不会尊重__new__
:https://github.com/python/mypy/issues/1020
解决方案是使用函数或static / classmethod代替。在你的情况下,我认为一个函数很多比一个类构造函数更直观,因为__new__
根本没有返回一个类BaseButton
的子类,这通常是不赞成的。当有人实例化一个类时,他们希望得到一个类实例,而不是字典或列表。