我目前的类型注释看起来类似于以下内容,我想使用 键入别名 以免重复太多:
类具有类变量,可以是:
- 某些指定的类型,或
- 一个函数(带参数)返回该 相同的 类型。
class Foo(object):
state: ClassVar[Union[str, Callable[[SomeObject], str]]] # str or func->str
number: ClassVar[Union[int, Callable[[SomeObject], int]]] # int or func->int
foobar: ClassVar[Union[bool, Callable[[SomeObject], bool]]] # bool or func->bool
# end class
为了完整起见,这里是一个示例实现:
class FooBar(Foo):
state = "something"
number = lambda x: int(x.bla)
@classmethod
def foobar(cls, x):
return x.blabla == cls.state
# end def
# end class
但是我不知道如何制作可订阅的泛型。我正在寻找类似的东西:
ClassValueOrCallable = lambda T: ClassVar[Union[T, Callable[[SomeObject], T]]]
class Foo(object):
state: ClassValueOrCallable(str)
number: ClassValueOrCallable(int)
foobar: ClassValueOrCallable(bool)
编辑:
以下
mypy的泛型类型别名部分
,似乎应该可以将其写为
T = TypeVar('T') # Any type.
ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]
class Foo(object):
state: ClassValueOrCallable[str]
number: ClassValueOrCallable[int]
foobar: ClassValueOrCallable[bool]
但至少PyCharm没有认识到这一点,并且只是将类型显示为
Any
,所以我不太确定它是否正确。
对泛型类型别名的语法是正确的。遇到的问题很可能是 PyCharm 的类型检查器无法完全理解它,而不是语法本身的问题。
以下是一些可以尝试的解决方法:
-
使用
typing.Type
代替T
: ```python from typing import Type, Union, Callable, ClassVarT = TypeVar('T') SomeObject = TypeVar('SomeObject') ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]
class Foo(object): state: ClassValueOrCallable[str] number: ClassValueOrCallable[int] foobar: ClassValueOrCallable[bool] ``` 这可能有助于 PyCharm 更好地推断类型。
-
添加类型提示到
SomeObject
: ```python from typing import Type, Union, Callable, ClassVarT = TypeVar('T') class SomeObject: ... ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]
class Foo(object): state: ClassValueOrCallable[str] number: ClassValueOrCallable[int] foobar: ClassValueOrCallable[bool] ```
-
忽略类型错误 : 如果确定代码在类型方面是正确的,可以暂时忽略 PyCharm 的错误。可以使用
# type: ignore
注释来做到这一点:python class Foo(object): state: ClassValueOrCallable[str] # type: ignore number: ClassValueOrCallable[int] # type: ignore foobar: ClassValueOrCallable[bool] # type: ignore
-
更新 PyCharm : 确保使用的是最新版本的 PyCharm,因为较旧的版本可能不支持所有最新的类型提示功能。
-
使用 MyPy : 如果想更严格地检查类型,可以使用 MyPy 这样的工具。MyPy 通常比 IDE 的内置类型检查器更强大。
请注意,即使 PyCharm 可能无法完美地理解类型别名,但只要语法正确,的代码仍然可以正常运行,并且 MyPy 等工具应该能够正确地检查类型。
标签:python,generics,python-typing From: 56317409