此模块支持由 和 指定的类型提示。最基本的支持包括类型 ,,,, 和 。有关完整规格,请参阅 。有关类型提示的简化介绍,请参阅
下面的函数接受并返回一个字符串,并注释如下:
在函数 greeting
中,参数 name
预期为 类型,返回类型为 。接受子类型作为参数。
通过将类型分配给别名来定义类型别名。在本示例中,Vector
和 List[float]
将被视为可互换的同义词:
类型别名可用于简化复杂类型签名。例如:
注意,None
作为类型提示是一种特殊情况,并由 type(None)
替代。
使用 辅助函数创建不同类型:
静态类型检查器将把新类型视为原始类型的子类。这有助于捕获逻辑错误:
您仍然可以对类型为 UserId
的变量执行所有 int
操作,但结果将始终为类型 int
。这允许您传递 UserId
在任何地方可能期望
int
,但将阻止您以无效方式意外创建 UserId
:
注意,这些检查仅由静态类型检查器强制执行。在运行时,语句 Derived = NewType('Derived', Base)
将使 Derived
成为立即返回任何传递的参数的函数。这意味着表达式
Derived(some_value)
不会创建一个新类或引入超出常规函数调用的任何开销。
这也意味着不可能创建 Derived
的子类型,因为它是运行时的标识函数,而不是实际类型。类似地,不可能基于 Derived
类型创建另一 :
有关详细信息,请参阅 。
回想一下,类型别名的使用声明两种类型是彼此的 equivalent。在所有情况下,执行 Alias = Original
将使静态类型检查器将 Alias
视为 完全等同 到
Original
。当您想要简化复杂类型签名时,这是有用的。
的值的地方使用。当您希望以最小的运行时成本防止逻辑错误时,这是有用的。
可以通过用类型hint:Callable[..., ReturnType]
中的参数列表替换文本省略号来声明可调用的返回类型,而不指定调用签名。
由于不能以通用方式静态推断容器中保存的对象的类型信息,因此已经扩展了抽象基类以支持预订来表示容器元素的预期类型。
通过使用在名为 的打字中可用的新工厂,可以对通用参数进行参数化。
用户定义的类可以定义为通用类。
Generic[T]
作为基类定义 LoggedVar
类采用单个类型参数 T
。这也使 T
有效作为类体中的类型。
基类使用定义 的元类,以便 LoggedVar[t]
作为类型有效:
通用类型可以具有任意数量的类型变量,并且类型变量可以被约束:
的每个类型变量参数必须是不同的。因此这是无效的:
您可以使用 的多重继承:
当从泛型类继承时,一些类型变量可以被修复:
在这种情况下,MyDict
具有单个参数 T
。
使用不指定类型参数的泛型类为每个位置假定 。在以下示例中,MyIterable
不是通用的,而是隐式地继承自
还支持用户定义的通用类型别名。例子:
的子类。通用类可以是通过包括抽象方法或属性的ABC,并且通用类也可以具有ABC作为基类而没有元类冲突。不支持通用元类。参数化泛型的结果被缓存,并且在类型模块中的大多数类型是可哈希的并且可比较的相等。
一种特殊类型的是 。静态类型检查器将把每种类型视为与 和 兼容,以与每种类型兼容。
这意味着可以对 上的类型的值执行任何操作或方法调用,并将其分配给任何变量:
请注意,在将 类型的值指定为更精确的类型时,不会执行类型检查。例如,即使 s
被声明为 类型并且在运行时接收到 值,静态类型检查器在将 a
分配给
此外,所有没有返回类型或参数类型的函数将默认使用 :
这种行为允许 在需要混合动态和静态类型代码时用作 逃生舱口。
将 的行为与 的行为进行对比。与 类似,每种类型是 的亚型。然而,与 不同,反之不是真的: 是 not 每个其他类型的子类型。
这意味着当值的类型是 时,类型检查器将拒绝几乎所有操作,并将其分配给更专门类型的变量(或使用它作为返回值)是类型错误。例如:
使用 以类型安全的方式指示值可以是任何类型。使用 表示值是动态类型。
模块定义了以下类,函数和装饰器:
类型变量主要用于静态类型检查器的好处。它们用作泛型类型以及通用函数定义的参数。有关泛型类型的更多信息,请参阅类Generic。通用函数的工作方式如下:
bytes 的重载。还要注意,如果参数是 的一些子类的实例,返回类型仍然是纯 。
指定上限。这意味着,对类型变量替换(显式或隐式)的实际类型必须是边界类型的子类,请参阅
通常类型通常通过从具有一个或多个类型变量的该类的实例化继承来声明。例如,通用映射类型可以定义为:
用 C
注释的变量可以接受类型 C
的值。相反,用 Type[C]
注释的变量可以接受类本身的值 - 具体地,它将接受 C
的 类对象。例如:
Type[C]
是协变的这一事实意味着 C
的所有子类应该实现与 C
相同的构造符签名和类方法签名。类型检查器应标记违反此情况,但也应允许在指定基类中与构造函数调用匹配的子类中构造函数调用。如何处理此特定情况需要类型检查器可能会在 的未来修订版本中更改。
的唯一的法律参数是类,类的联合和 。例如:
具有一个抽象方法 __abs__
的ABC,其返回类型是协变的。
具有一个抽象方法 __round__
的ABC,其返回类型是协变的。
此类型表示类型 , 和
作为此类型的简写, 可用于注释上述任何类型的参数。
的通用版本。用于注释返回类型。要注释参数,最好使用抽象集合类型,例如 , 或 。
这种类型可以如下使用:
的通用版本。类型变量的方差和顺序对应于例如 的方差和顺序:
的通用版本。这种类型的用法如下:
注意,与打字模块中的许多其他泛型不同, 的 SendType
逆向变化,而不是协变或不变。
I/O流类型的包装器命名空间。
BinaryIO
。这些表示由 返回的I/O流的类型。
正则表达式匹配类型的Wrapper命名空间。
这定义了对应于来自 和 的返回类型的类型别名 Pattern
和 Match
。这些类型(和相应的功能)在 AnyStr
中是通用的,并且可以通过写入
结果类有一个额外的属性:_field_types
,给出一个dict将字段名称映射到类型。 (字段名称在 _fields
属性中,它是namedtuple API的一部分。)
在 3.6 版更改: 添加了对 变量注释语法的支持。
一个辅助函数,用于向类型检查器指示不同类型,请参阅 。在运行时它返回一个返回其参数的函数。用法:
这将返回不变的值。对于类型检查器,这表示返回值具有指定的类型,但在运行时我们有意不检查任何东西(我们希望这是尽可能快的)。
返回一个包含函数,方法,模块或类对象的类型提示的字典。
这通常与 obj.__annotations__
相同。此外,编码为字符串字面量的前向引用通过在 globals
和 locals
命名空间中评估它们来处理。如果必要,如果设置了等于
None
的默认值,则为函数和方法注释添加 Optional[t]
。对于类 C
,返回通过沿着 C.__mro__
以相反顺序合并所有
@overload
装饰器允许描述支持参数类型的多个不同组合的函数和方法。一系列 @overload
装饰的定义后面必须紧跟一个非 @overload
装饰的定义(对于相同的功能/方法)。
@overload
修饰的定义仅仅对类型检查器有利,因为它们将被非 @overload
修饰的定义覆盖,而后者在运行时使用,但是应该被类型检查器忽略。在运行时,直接调用 @overload
装饰函数将提高
NotImplementedError
。提供更精确类型的重载示例可以使用联合或类型变量表示:
有关详细信息和与其他类型语义的比较,请参阅 。
装饰器指示注释不是类型提示。
参数必须是类或函数;如果它是一个类,它将递归应用于该类中定义的所有方法(但不适用于在其超类或子类中定义的方法)。
装饰师给另一个装饰师 效果。
这将装饰器包装在 中的装饰函数。
表示无约束类型的特殊类型。
参数必须是类型,并且必须至少有一个。
工会联合会被夷为平地。:
单个参数的联合消失,例如。:
跳过冗余参数,例如。:
当比较联合时,参数顺序被忽略,例如。:
当一个类及其子类存在时,前者被跳过,例如。:
您不能子类化或实例化union。
请注意,这不是一个可选参数的概念,它是一个具有默认值的参数。具有默认值的可选参数不需要在其类型注释上使用 Optional
限定符(虽然如果默认值为 None
,则推断)。如果允许 None
的显式值,则强制参数可以仍然具有
元组类型; Tuple[X, Y]
是具有类型X的第一项和类型Y的第二项的两个项目的元组的类型。
要指定同构类型的可变长度元组,请使用文字省略号,例如。 Tuple[int, ...]
。普通的 相当于
订阅语法必须始终使用两个值:参数列表和返回类型。参数列表必须是类型列表或省略号;返回类型必须是单个类型。
没有用于指示可选或关键字参数的语法;这样的函数类型很少用作回调类型。 Callable[..., ReturnType]
(文本省略号)可以用于键入提示,可调用任何数量的参数并返回 ReturnType
。平原 等价于
特殊类型构造来标记类变量。
如 中所介绍的,包装在ClassVar中的变量注释表示给定属性旨在用作类变量,并且不应在该类的实例上设置。用法:
只接受类型,不能进一步订阅。
不是一个类本身,不应该与 或 一起使用。注意, 不会改变Python运行时行为;它可以被第三方类型检查器使用,因此以下代码可能会被标记为错误:
它意味着用于可以接受任何种类的字符串而不允许不同种类的字符串混合的函数。例如:
由第三方静态类型检查器假定为 True
的特殊常量。它在运行时是 False
。用法:
做过前端开发的同志都应该知道或了解过jquery,jQuery 是一个用来处理DOM的JavaScript库。pyquery说白了就是jquery的Python版本。下面这篇文章主要给大家介绍了关于python3解析库pyquery的相关资料,需要的朋友可以参考下
pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便
pyquery==.cn/cssref/css_网站美女图片12万张用时28分钟,总大小9G,主要受网络带宽影响,下载数据有点慢
#根据分页链接地址获取图片并下载 程序运行时间:28分27秒
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。