- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Python中Documentation ,我们发现:
T = TypeVar('T') # Can be anything
S = TypeVar('S', bound=str) # Can be any subtype of str
A = TypeVar('A', str, bytes) # Must be exactly str or bytes
我们还发现了这段代码:
def repeat(x: T, n: int) -> Sequence[T]:
"""Return a list containing n references to x."""
return [x]*n
def print_capitalized(x: S) -> S:
"""Print x capitalized, and return x."""
print(x.capitalize())
return x
def concatenate(x: A, y: A) -> A:
"""Add two strings or bytes objects together."""
return x + y
然后添加这行代码
print(concatenate("hello ", "world"))
使用 mypy 应该完全没问题,确实如此!
我现在定义一个类:
class sstr(str):
pass
并使用此代码:
s1 = sstr("hello ")
s2 = sstr("world")
print(concatenate(s1, s2))
在 A 的定义中,它说:“必须恰好是 str 或 bytes”s1 和 s2 并不完全是 str 或 bytes,而是 sstr,它是 str 的子类。所以在我看来,mypy 应该引发一个错误,但它说:
Success: no issues found in 1 source file
显然,我一定是出了什么问题。
我什至在类里面尝试过
class sstr(str):
def __add__(self, other):
return self + other + "_42"
def __sub__(self, other):
return "foo"
我做错了什么?有人可以帮忙吗?
最佳答案
“完全”在这里具有误导性。一般来说,类型系统假定里氏可替换性。因此,T
类型的子类型 S
始终可以代替 T
。 “确切”是指特定的行为。当您使用受约束而不是绑定(bind)类型变量*时,结果始终是 str
或 bytes
,因此即使您提供 MyStr
,就类型检查器而言,它返回一个 str
:
import typing
T = typing.TypeVar("T", str, bytes)
class MyString(str):
pass
def alphabetize(a: T, b: T) -> T:
if a >= b:
return a
else:
return b
c0 = alphabetize("foo", "bar")
c1 = alphabetize("foo", MyString("bar"))
c2 = alphabetize(MyString("foo"), MyString("bar"))
reveal_type(c0)
reveal_type(c1)
reveal_type(c2)
使用mypy
给出:
test_typing.py:20: note: Revealed type is "builtins.str"
test_typing.py:21: note: Revealed type is "builtins.str"
test_typing.py:22: note: Revealed type is "builtins.str"
Success: no issues found in 1 source file
PEP 483 中是这样描述的,第一个描述类型系统如何工作以及类型变量的概念的 PEP:
A constrained type variable ranges only over constrains t1, etc.exactly; subclasses of the constrains are replaced by the most-derivedbase class among t1,
但是,当您给它一个上限时,它就不是这样工作的:
import typing
T = typing.TypeVar("T", bound=str)
class MyString(str):
pass
def alphabetize(a: T, b: T) -> T:
if a >= b:
return a
else:
return b
c0 = alphabetize("foo", "bar")
c1 = alphabetize("foo", MyString("bar"))
c2 = alphabetize(MyString("foo"), MyString("bar"))
reveal_type(c0)
reveal_type(c1)
reveal_type(c2)
mypy
为您提供:
test_typing.py:20: note: Revealed type is "builtins.str"
test_typing.py:21: note: Revealed type is "builtins.str"
test_typing.py:22: note: Revealed type is "test_typing.MyString"
Success: no issues found in 1 source file
请注意,在混合类型的情况下,结果是可能的最窄的常见类型。考虑一种具有更深继承层次结构的情况:
import typing
T = typing.TypeVar("T", bound=str)
class SpecialString(str):
pass
class SuperSpecialString(SpecialString):
pass
def alphabetize(a: T, b: T) -> T:
if a >= b:
return a
else:
return b
c0 = alphabetize(SpecialString("foo"), SuperSpecialString("bar"))
c1 = alphabetize("foo", SuperSpecialString("bar"))
c2 = alphabetize(SuperSpecialString("foo"), SuperSpecialString("bar"))
reveal_type(c0)
reveal_type(c1)
reveal_type(c2)
在这里,mypy
给出:
test_typing.py:22: note: Revealed type is "test_typing.SpecialString"
test_typing.py:23: note: Revealed type is "builtins.str"
test_typing.py:24: note: Revealed type is "test_typing.SuperSpecialString
关于python - 类型注释 : TypeVar: Bound, 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76346099/
我正在努力理解以下两个 TypeVar 之间的区别年代: from typing import TypeVar, Union class A: pass class B: pass T = TypeV
我被困在试图理解 TypeVar 的边界上当以两种不同的方式使用它时: Enums = TypeVar("Enums", Enum1, Enum2) Enums = TypeVar("Enums",
我有一个通用类 Graph[Generic[T], object] . 我的问题是,是否有任何函数返回作为泛型传递给类 Graph 的类型? >>> g = Graph[int]() >>> magi
我问自己是否有关于使用 TypeVar 的最佳实践和 overload在 python 中用于返回与输入相同类型的函数。考虑这些例子。 示例 1. 使用 TypeVar : from typing i
我正在使用 mypy和 typing python中的模块。想象一下我有一个泛型类型: ContainerT = TypeVar('ContainerT') class Thingy(Generic[
作为一名 C++ 程序员,以下代码对我来说似乎很自然,但它无法运行: from typing import TypeVar, Generic, List, NewType TPopMember = T
众所周知,在 C# 中,可以指定自定义属性规范的目标,如示例中所示 [method: SomeDecoration] [return: SomeOtherMark] int MyMethod(); “
我正在尝试使用 TypeVar 将 init 参数指示为某种类型。 但我做错了,或者它甚至可能不可能。 from typing import TypeVar T=TypeVar("T") class
假设我有一些通用函数: def foo(*args): for arg in args: print(arg) 如果我想输入提示 *args,根据 PEP我只需要指定类型 1
在Python中Documentation ,我们发现: T = TypeVar('T') # Can be anything S = TypeVar('S', bound=
TypeVar和 NewType似乎相关,但我不确定何时应该使用它们,或者在运行时和静态时有什么区别。 最佳答案 这两个概念的相关性并不比任何其他与类型相关的概念更多。 简而言之,TypeVar 是一
例如,我有一段代码如下: from typing import Type, TypeVar, cast class SuperClass: pass T = TypeVar('T', boun
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.3:jar (package-jav
我试图理解以下代码段中的类型提示 Getter[T]: 简化示例 T = TypeVar('T') Getter = Callable[[T, str], str] class AbstractCla
我正在使用 pytype (2019.10.17,最新版本到现在)作为我的代码类型检查器开发了一个工具,可以通过索引文件随机读取msgpack文件,索引文件记录了每条消息的位置(msgpack文件中的
出于某种原因,这段代码被认为是一个问题: from typing import * T = TypeVar("T", bound="Foo") S = TypeVar("S") class Foo(G
我在以下代码中遇到了问题,至少根据 mypy 是这样的: from multiprocessing import Pool from typing import Tuple, TypeVar T =
假设我有一个基类 from typing import List, Optional class Node: def __init__(self, name: str) -> None:
我想实现一个通用字典,将文本键映射到 MyConstrainingClass 或继承自 MyConstrainingClass 的类,因此我声明了 TypeVar 和 MyDict 类如下: from
如果我想要一个可以是多种可能类型的类型,Unions 似乎就是我表示的方式: U = Union[int, str] U 可以是 int 或 str。 我注意到,TypeVar允许可选的 var-ar
我是一名优秀的程序员,十分优秀!