Ste*_*veJ 8 python type-hinting python-3.x
考虑这个人为的例子;
@dataclass
class A:
name: str = "John"
....
@dataclass
class B:
name: str = "Doe"
Run Code Online (Sandbox Code Playgroud)
问:如何键入提示具有属性的对象,例如以下内容?
def print_name(obj: HasAttr['name'])
print(obj.name)
Run Code Online (Sandbox Code Playgroud)
我理解展示你所尝试的内容的 SO 规则。我能提供的最好的就是我已经搜索了文档;Pep526、PythonSheets、文档,并且我知道这个问题。似乎没有任何帮助(或者也许我错过了。)
[编辑]我认识到你可以通过继承到达那里,但我不想走那条路。
所以,你所描述的是结构类型。这与 python 类型系统所基于的基于类的名义子类型不同。然而,结构子类型有点像 Python 动态鸭子类型的静态类型版本。
Python 的类型系统通过typing.Protocol.
举个例子,假设我们有一个 Python 模块test_typing.py:
from typing import Protocol
from dataclasses import dataclass
class Named(Protocol):
name: str
@dataclass
class A:
name: str
id: int
@dataclass
class B:
name: int
@dataclass
class C:
foo: str
def frobnicate(obj: Named) -> int:
return sum(map(ord, obj.name))
frobnicate(A('Juan', 1))
frobnicate(B(8))
frobnicate(C('Jon'))
Run Code Online (Sandbox Code Playgroud)
使用 mypy 版本 0.790:
(py38) juanarrivillaga@Juan-Arrivillaga-MacBook-Pro ~ % mypy test_typing.py
test_typing.py:28: error: Argument 1 to "frobnicate" has incompatible type "B"; expected "Named"
test_typing.py:28: note: Following member(s) of "B" have conflicts:
test_typing.py:28: note: name: expected "str", got "int"
test_typing.py:29: error: Argument 1 to "frobnicate" has incompatible type "C"; expected "Named"
Found 2 errors in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2078 次 |
| 最近记录: |