Mypy:实例列表?可调用?

时间:2017-11-20 15:02:37

标签: python python-3.6 mypy

我已经开始在应用程序上测试mypy,但在尝试使用instances of class时我没有成功。

ButtonGenerator.__new__应接受BaseButtonURLButton)或BaseButtonURLButton)实例的列表。

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列表。

1 个答案:

答案 0 :(得分:0)

如果mypy尝试返回隐式类型以外的其他类型,则mypy目前不会尊重__new__https://github.com/python/mypy/issues/1020

解决方案是使用函数或static / classmethod代替。在你的情况下,我认为一个函数很多比一个类构造函数更直观,因为__new__根本没有返回一个类BaseButton的子类,这通常是不赞成的。当有人实例化一个类时,他们希望得到一个类实例,而不是字典或列表。