带描述符的类型提示

时间:2019-01-29 03:28:29

标签: python python-3.x type-hinting mypy typehints

this pull request中,似乎添加了对描述符的类型提示支持。

但是似乎没有发布任何最终的“正确”用法示例,也似乎没有向typing moduleMypy添加任何文档。

看起来 的正确用法类似于this

from typing import TypeVar

T = TypeVar('T')
V = TypeVar('V')


class classproperty():
    def __init__(self, getter: Callable[[Type[T], V]) -> None:
        self.getter = getter

    def __get__(self, instance: Optional[T], owner: Type[T]) -> V
        return self.getter(owner)


def forty_two(cls: Type) -> int:
    return 42


class C:
    forty_two: int = classproperty(foo)

这似乎合乎逻辑,但是我不知道这是否是正确的做事方式。

是否有任何文档?还是完整的示例在合并后的版本上可以实际使用?

2 个答案:

答案 0 :(得分:1)

我无法让示例与 MyPy 一起使用。但是,下面的派生定义对我有用:

"""Defines the `classproperty` decorator."""

from typing import Any, Callable, Optional, Type, TypeVar

T = TypeVar("T")
V = TypeVar("V")


class classproperty(property):
    """Class property decorator."""

    def __init__(self, getter: Callable[[Any], V]) -> None:
        """Override getter."""
        self.getter = getter  # type: ignore

    def __get__(self, instance: Optional[T], owner: Type[T]) -> V:  # type: ignore
        return self.getter(owner)  # type: ignore

    def __set__(self, obj, value):
        super(classproperty, self).__set__(type(obj), value)

    def __delete__(self, obj):
        super(classproperty, self).__delete__(type(obj))

答案 1 :(得分:0)

问题中描述的方法似乎对Mypy和PyCharm类型检查器均适用。