bokeh.core.properties#
为了简化和自动化用于描述绘图和场景的模型的创建和使用,Bokeh 提供了一组属性和属性 mixin。属性类为大量有用的类型提供自动验证和序列化。Mixin 和容器类提供了一种简单的方法,可以将属性批量添加到模型类中。
为 Bokeh 模型提供属性类型
属性是可以在 Bokeh 模型上作为类属性分配的对象,以提供自动序列化、验证和文档。
本文档分为以下几个部分:
概述#
此模块中定义了许多属性类型,例如 Int
用于表示整数值,Seq
用于表示序列(例如列表或元组等)。属性也可以组合:Seq(Float)
表示一个浮点值序列。
例如,以下定义了一个具有整数、字符串和 list[float] 属性的模型
class SomeModel(Model):
foo = Int
bar = String(default="something")
baz = List(Float, help="docs for baz prop")
如您所见,属性可以声明为仅为属性类型,例如 foo = Int
,在这种情况下,属性会在新的 Model 对象上自动实例化。或者可以在类上实例化属性,并使用默认值和帮助字符串进行配置。
可以通过为初始化器指定关键字参数来初始化此类的属性
m = SomeModel(foo=10, bar="a str", baz=[1,2,3,4])
也可以在实例上设置属性
m.foo = 20
尝试将属性设置为错误类型的值会导致 ValueError
异常
>>> m.foo = 2.3
Traceback (most recent call last):
<< traceback omitted >>
ValueError: expected a value of type Integral, got 2.3 of type float
具有属性的模型知道如何序列化自身,以便 BokehJS 能够理解。此外,在属性上提供的任何帮助字符串都可以使用 bokeh.sphinxext 模块中的 Sphinx 扩展轻松自动提取。
基本属性#
- class Alpha(default: float | UndefinedType | IntrinsicType = 1.0, *, help: str | None = None)[source]#
- class Angle(default: float | UndefinedType | IntrinsicType = 0.0, *, help: str | None = None)[source]#
接受浮点角度值。
Angle
等效于Float
,但它适用于语义上更有意义的情况。- 参数:
default (float, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
- class Any(default: Any | UndefinedType | IntrinsicType | None = None, help: str | None = None)[source]#
接受所有值。
Any
属性不会执行任何验证或转换。- 参数:
default (obj 或 None, 可选) – 从此属性创建的属性的默认值(默认:None)
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class AnyModel(HasProps): ... prop = Any() ... >>> m = AnyModel() >>> m.prop = True >>> m.prop = 10 >>> m.prop = 3.14 >>> m.prop = "foo" >>> m.prop = [1, 2, 3]
- class AnyRef(default: Any | UndefinedType | IntrinsicType | None = None, help: str | None = None)[source]#
接受所有值并强制引用发现。
- class Auto[source]#
仅接受字符串“auto”。
对于可以配置为“自动”行为的属性很有用。
示例
此属性通常与
Either
属性一起使用最有效。>>> class AutoModel(HasProps): ... prop = Either(Float, Auto) ... >>> m = AutoModel() >>> m.prop = 10.2 >>> m.prop = "auto" >>> m.prop = "foo" # ValueError !! >>> m.prop = [1, 2, 3] # ValueError !!
- class Bool(default: bool | UndefinedType | IntrinsicType = False, *, help: str | None = None)[source]#
接受布尔值。
- 参数:
default (obj, optional) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class BoolModel(HasProps): ... prop = Bool(default=False) ... >>> m = BoolModel() >>> m.prop = True >>> m.prop = False >>> m.prop = 10 # ValueError !!
- class Byte(default: int | UndefinedType | IntrinsicType = 0, help: str | None = None)[source]#
接受整数字节值 (0-255)。
示例
>>> class ByteModel(HasProps): ... prop = Byte(default=0) ... >>> m = ByteModel() >>> m.prop = 255 >>> m.prop = 256 # ValueError !! >>> m.prop = 10.3 # ValueError !!
- class Bytes(default: bytes | UndefinedType | IntrinsicType = b'', *, help: str | None = None)[source]#
接受字节值。
- class Color(default: str | tuple[int, int, int] | tuple[int, int, int, float] | UndefinedType | IntrinsicType = Undefined, *, help: str | None = None)[source]#
接受各种方式的颜色值。
如果颜色以字符串形式提供,Bokeh 将确定此字符串是否表示 命名 CSS 颜色(例如“red”)、CSS4 颜色字符串(例如“rgb(0, 200, 0) ”)或十六进制值(例如“#00FF00”)。
如果提供 3 元组,则将其视为 RGB 值(介于 0 和 255 之间)。
如果提供 4 元组,则将其视为 RGBA 值(RGB 介于 0 和 255 之间,alpha 为 0 到 1 之间的浮点数)。
如果提供 32 位无符号整数,则将其视为 0xRRGGBBAA 字节顺序模式中的 RGBA 值。
示例
>>> class ColorModel(HasProps): ... prop = Color() ... >>> m = ColorModel() >>> m.prop = "firebrick" >>> m.prop = "#a240a2" >>> m.prop = (100, 100, 255) >>> m.prop = (100, 100, 255, 0.5) >>> m.prop = "junk" # ValueError !! >>> m.prop = (100.2, 57.3, 10.2) # ValueError !!
- class Complex(default: complex | UndefinedType | IntrinsicType = 0j, *, help: str | None = None)[source]#
接受复数浮点数。
- 参数:
default (complex, optional) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
- CoordinateLike#
Either(Float, Datetime, Factor(Either(String, Tuple(String, String), Tuple(String, String, String)))) 的别名
- class DashPattern(default=[], *, help: str | None = None)[source]#
接受线形虚线规范。
表达描述线形虚线的模式。
DashPattern
值可以通过多种方式指定一个枚举: “solid”, “dashed”, “dotted”, “dotdash”, “dashdot”
一个元组或整数列表,以 HTML5 Canvas 虚线规范样式 指定。 注意,如果整数列表的元素数量为奇数,则该列表将被复制,并且该复制列表将成为新的虚线列表。
要指示虚线关闭(实线),请指定空列表 []。
- class Date(*, default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
接受 ISO 格式的日期(但不是日期时间)值。
- class Datetime(default: str | date | datetime | UndefinedType | IntrinsicType = Undefined, *, help: str | None = None)[source]#
接受 ISO 格式的日期时间值。
- class Either(type_param0: type[Property[Any]] | Property[Any], *type_params: type[Property[Any]] | Property[Any], default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
接受根据其他属性类型序列的值。
示例
>>> class EitherModel(HasProps): ... prop = Either(Bool, Int, Auto) ... >>> m = EitherModel() >>> m.prop = True >>> m.prop = 10 >>> m.prop = "auto" >>> m.prop = 10.3 # ValueError !! >>> m.prop = "foo" # ValueError !!
- class Enum(enum: type[Literal['']], *, default: str | UndefinedType | IntrinsicType = ..., help: str | None = ...)[source]#
- class Enum(enum: Enumeration, *, default: str | UndefinedType | IntrinsicType = ..., help: str | None = ...)
- class Enum(enum: str, *values: str, default: str | UndefinedType | IntrinsicType = ..., help: str | None = ...)
接受来自枚举的值。
枚举中的第一个值用作默认值,除非使用
default
关键字参数。有关更多信息,请参阅 bokeh.core.enums。
- class Float(default: float | UndefinedType | IntrinsicType = 0.0, *, help: str | None = None)[source]#
接受浮点值。
- 参数:
default (float, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class FloatModel(HasProps): ... prop = Float() ... >>> m = FloatModel() >>> m.prop = 10 >>> m.prop = 10.3 >>> m.prop = "foo" # ValueError !!
- class FontSize(default: str | UndefinedType | IntrinsicType = '', *, help: str | None = None)[source]#
- class Image(*, default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
接受图像文件类型,例如 PNG、JPEG、TIFF 等。
此属性可以用以下配置:
pathlib.Path
图像文件路径数据 URL 编码的图像字符串
用
PIL.Image.open
加载的字符串文件名RGB(A) NumPy 数组,将转换为 PNG
PIL.Image.Image
对象
在所有情况下,图像数据都将序列化为 Base64 编码的字符串。
- class Int(default: int | UndefinedType | IntrinsicType = 0, *, help: str | None = None)[source]#
接受有符号整数值。
- 参数:
default (int, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class IntModel(HasProps): ... prop = Int() ... >>> m = IntModel() >>> m.prop = 10 >>> m.prop = -200 >>> m.prop = 10.3 # ValueError !!
- class Interval(type_param: type[Property[T]] | Property[T], start: T, end: T, *, default: T | UndefinedType | IntrinsicType = Undefined, help: str | None = None)[source]#
接受包含在给定区间内的数值。
- 参数:
interval_type (数值属性) – 区间的数值类型,例如
Int
、Float
start (数字) – 区间的最小允许值。小于
start
的值会导致验证错误。end (数字) – 区间的最大允许值。大于
end
的值会导致验证错误。
示例
>>> class RangeModel(HasProps): ... prop = Range(Float, 10, 20) ... >>> m = RangeModel() >>> m.prop = 10 >>> m.prop = 20 >>> m.prop = 15 >>> m.prop = 2 # ValueError !! >>> m.prop = 22 # ValueError !! >>> m.prop = "foo" # ValueError !!
- class JSON(default: str | UndefinedType | IntrinsicType = '', *, help: str | None = None)[source]#
接受 JSON 字符串值。
BokehJS 通过包含 JSON 内容的字符串来传输和接收该值。即,您必须使用
JSON.parse
将该值解包到 JavaScript 哈希中。- 参数:
default (字符串, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
- class MinMaxBounds(default='auto', *, accept_datetime: bool = False, help: str | None = None)[source]#
接受 (min, max) 界限元组,用于 Ranges。
边界以
(min, max)
元组的形式提供,因此无论您的范围是递增还是递减,第一个元素都应该是范围的最小值,第二个元素应该是最大值。设置 min > max 将导致ValueError
。将边界设置为 None 将允许您的绘图任意平移/缩放。如果您只想约束绘图的一端,可以将 min 或 max 设置为
None
,例如DataRange1d(bounds=(None, 12))
- class NonNegative(type_param: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
一个接受其他类型的值的属性,同时具有未定义的默认值。
- class Null(default: None | UndefinedType | IntrinsicType = None, *, help: str | None = None)[source]#
仅接受
None
值。将此与
Either(Null, Type)
或作为Nullable(Type)
结合使用。
- class Percent(default: float | UndefinedType | IntrinsicType = 0.0, *, help: str | None = None)[source]#
接受浮点百分比值。
Percent
对于指定诸如 alpha 值和范围之类的内容可能有用且在语义上有意义。- 参数:
default (float, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class PercentModel(HasProps): ... prop = Percent() ... >>> m = PercentModel() >>> m.prop = 0.0 >>> m.prop = 0.2 >>> m.prop = 1.0 >>> m.prop = -2 # ValueError !! >>> m.prop = 5 # ValueError !!
- class Positive(type_param: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
一个接受其他类型的值的属性,同时具有未定义的默认值。
- class RGB(*, default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
接受颜色。RGB 值。
- class Regex(regex: str, *, default: str | UndefinedType | IntrinsicType = Undefined, help: str | None = None)[source]#
接受与给定正则表达式匹配的字符串。
- 参数:
default (字符串, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class RegexModel(HasProps): ... prop = Regex("foo[0-9]+bar") ... >>> m = RegexModel() >>> m.prop = "foo123bar" >>> m.prop = "foo" # ValueError !! >>> m.prop = [1, 2, 3] # ValueError !!
- class Size(default: float | UndefinedType | IntrinsicType = 0.0, *, help: str | None = None)[source]#
接受非负数值。
- 参数:
default (float, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class SizeModel(HasProps): ... prop = Size() ... >>> m = SizeModel() >>> m.prop = 0 >>> m.prop = 10e6 >>> m.prop = -10 # ValueError !! >>> m.prop = "foo" # ValueError !!
- class String(default: str | UndefinedType | IntrinsicType = '', *, help: str | None = None)[source]#
接受字符串值。
- 参数:
default (字符串, 可选) – 从此属性创建的属性的默认值。
help (str 或 None, 可选) – 此属性的文档字符串。在生成 Spinx 文档时,它将自动被 bokeh_prop 扩展使用。(默认:None)
示例
>>> class StringModel(HasProps): ... prop = String() ... >>> m = StringModel() >>> m.prop = "foo" >>> m.prop = 10.3 # ValueError !! >>> m.prop = [1, 2, 3] # ValueError !!
容器属性#
- class Array(item_type: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = Undefined, help: str | None = None)[source]#
接受 NumPy 数组值。
- class ColumnData(keys_type: type[Property[Any]] | Property[Any], values_type: type[Property[Any]] | Property[Any], *, default: T | UndefinedType | IntrinsicType = {}, help: str | None = None)[source]#
接受适合作为
ColumnDataSource
的data
属性的 Python 字典。此类是
Dict
的一个特化,它有效地处理对 NumPy 数组进行编码的列。
- class Dict(keys_type: type[Property[Any]] | Property[Any], values_type: type[Property[Any]] | Property[Any], *, default: T | UndefinedType | IntrinsicType = {}, help: str | None = None)[source]#
接受 Python 字典值。
如果传递了默认值,则每次使用此属性时都会使用该值的浅拷贝。
- class List(item_type: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = [], help: str | None = None)[source]#
接受 Python 列表值。
- class Seq(item_type: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = Undefined, help: str | None = None)[source]#
接受非字符串有序序列值,例如列表、元组、数组。
- class Set(item_type: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = {}, help: str | None = None)[source]#
接受 Python
set()
值。
数据规范属性#
- class AngleSpec(default=Undefined, units_default='rad', *, help: str | None = None)[source]#
一个
DataSpec
属性,接受数值固定值,还提供一个关联的单位属性来存储角度单位。单位的有效值是
"deg"
,"rad"
,"grad"
和"turn"
。
- class ColorSpec(default, *, help: str | None = None)[source]#
-
ColorSpec
属性首先尝试将字符串值解释为颜色。否则,字符串值将被解释为字段名称。例如m.color = "#a4225f" # value (hex color string) m.color = "firebrick" # value (named CSS color string) m.color = "foo" # field (named "foo")
这种自动解释可以使用字典格式直接覆盖,或者使用
field()
函数m.color = { "field": "firebrick" } # field (named "firebrick") m.color = field("firebrick") # field (named "firebrick")
- class DataSpec(value_type, default, *, help: str | None = None)[source]#
接受固定值或引用
ColumnDataSource
中列的字符串名称的属性的基类。许多 Bokeh 模型都有属性,用户可能希望将其设置为单个固定值,或者让属性从数据源中的某一列获取值。举个具体的例子,考虑一个带有用于位置的
x
属性的图形。我们可能希望将所有绘制的图形设置为相同的位置,例如x=10
。能够这样写会很方便glyph.x = 10
或者,也许每个绘制的图形都应该根据数据源的“pressure”列具有不同的位置。在这种情况下,我们希望能够这样写
glyph.x = "pressure"
Bokeh
DataSpec
属性(及其子类)提供了这种表达的便利性和一致性。最终,所有DataSpec
属性都解析为字典值,其中包含一个"value"
键,或者一个"field"
键,具体取决于设置方式。例如
glyph.x = 10 # => { 'value': 10 } glyph.x = "pressure" # => { 'field': 'pressure' }
当这些底层字典值在浏览器中被接收时,BokehJS 知道如何解释它们并采取正确的预期操作(即,将图形绘制在
x=10
处,或将图形绘制在“pressure”列的x
坐标处)。这样一来,从用户的角度来看,这两种用例都可以在 Python 中轻松表达,而无需进行任何不同的处理。值得注意的是,
DataSpec
属性也可以直接使用正确格式化的字典值设置glyph.x = { 'value': 10 } # same as glyph.x = 10 glyph.x = { 'field': 'pressure' } # same as glyph.x = "pressure"
在某些情况下,直接将属性设置为字典可能很有用。例如,一些
DataSpec
子类也会在字典中添加一个"units"
键。此键通常会自动设置,但字典格式提供了一种直接的机制来覆盖,如果需要。此外,DataSpec
可以有一个"transform"
键,该键指定应在任何固定值或字段值在使用前应用于它们的客户端变换。例如,你可能希望将Jitter
变换应用于x
值glyph.x = { 'value': 10, 'transform': Jitter(width=0.4) }
请注意,
DataSpec
本身通常没有用。通常,模型会使用一个子类(例如NumberSpec
或ColorSpec
)来定义属性。例如,一个 Bokeh 模型具有可以处理固定值或列的x
、y
和color
属性,可能看起来像class SomeModel(Model): x = NumberSpec(default=0, help="docs for x") y = NumberSpec(default=0, help="docs for y") color = ColorSpec(help="docs for color") # defaults to None
- class DistanceSpec(default=Undefined, units_default='data', *, help: str | None = None)[source]#
一个
DataSpec
属性,它接受数字固定值或引用ColumnDataSource
中列的字符串,并且还提供一个关联的单位属性来存储单位信息。单位的有效值为"screen"
和"data"
。
- class FontSizeSpec(default, *, help: str | None = None)[source]#
一个
DataSpec
属性,它接受字体大小固定值。FontSizeSpec
属性首先尝试将字符串值解释为字体大小(即有效的 CSS 长度值)。否则,字符串值将被解释为字段名称。例如m.font_size = "13px" # value m.font_size = "1.5em" # value m.font_size = "foo" # field
所有有效 CSS 长度单位的完整列表可以在以下位置找到
- class MarkerSpec(default, *, help: str | None = None)[source]#
一个
DataSpec
属性,它接受标记类型作为固定值。MarkerSpec
属性首先尝试将字符串值解释为标记类型。否则,字符串值将被解释为字段名称。例如m.font_size = "circle" # value m.font_size = "square" # value m.font_size = "foo" # field
- class NumberSpec(default=Undefined, *, help: str | None = None, accept_datetime=True, accept_timedelta=True)[source]#a
一个
DataSpec
属性,它接受数值和日期时间固定值。默认情况下,日期和日期时间值会立即转换为自纪元以来的毫秒数。可以通过传递
accept_datetime=False
来禁用日期时间值的处理。默认情况下,时间间隔值会立即转换为绝对毫秒数。可以通过传递
accept_timedelta=False
来禁用时间间隔值的处理。时间间隔值被解释为绝对毫秒数。
m.location = 10.3 # value m.location = "foo" # field
- class SizeSpec(default=Undefined, *, help: str | None = None, accept_datetime=True, accept_timedelta=True)[source]#
一个
DataSpec
属性,接受非负数值作为大小值,或者指向ColumnDataSource
中列的字符串。
- class StringSpec(default, *, help: str | None = None)[source]#
一个
DataSpec
属性,接受字符串固定值。由于可接受的固定值和字段名都是字符串,因此可能需要明确地区分这些可能性。默认情况下,字符串值被解释为字段,但是可以使用
value()
函数来指定字符串被解释为值m.title = value("foo") # value m.title = "foo" # field
- class UnitsSpec(default, units_enum, units_default, *, help: str | None = None)[source]#
一个
DataSpec
属性,接受数值固定值,并提供一个相关的单位属性来存储单位信息。
辅助函数#
- expr(expr: Expression, transform: NotRequired[Transform] = Unspecified, units: NotRequired[str] = Unspecified) None #
Expr(expr: ‘Expression’, transform: ‘NotRequired[Transform]’ = Unspecified, units: ‘NotRequired[str]’ = Unspecified)
特殊属性#
- class Instance(instance_type: type[T] | Callable[[], type[T]] | str, default: T | UndefinedType | IntrinsicType = Undefined, help: str | None = None)[source]#
接受可序列化类型实例的值(例如
HasProps
)。
- class InstanceDefault(model: type[I], **kwargs: Any)[source]#
为 Instance 默认值提供延迟初始化器。
这对于具有 Instance 属性的 Bokeh 模型很有用,这些属性应该为每个模型实例提供唯一的默认值。使用 InstanceDefault 将比 lambda 初始化器提供更好的面向用户的文档。
- class Include(delegate: type[HasProps], *, help: str = '', prefix: str | None = None)[source]#
在 Bokeh 模型中包含“mix-in”属性集合。
有关更多详细信息,请参见 bokeh.core.property_mixins。
- class Nullable(type_param: type[Property[T]] | Property[T], *, default: T | None | UndefinedType | IntrinsicType = None, help: str | None = None)[source]#
一个接受
None
或其他类型值的属性。
- class NotSerialized(type_param: type[Property[T]] | Property[T], *, default: T | UndefinedType | IntrinsicType = Intrinsic, help: str | None = None)[source]#
一个状态不会与浏览器同步的属性。
- class Object(instance_type: type[T] | Callable[[], type[T]] | str, default: T | UndefinedType | IntrinsicType = Undefined, help: str | None = None)[source]#
接受任何类的实例作为值。
注意
这主要用于验证目的。在序列化过程中,无论如何,不可序列化的对象都将失败。
- class Override(*, default: T)[source]#
覆盖派生模型中 Bokeh 属性的属性。
当子类化 Bokeh 模型时,可能希望更改属性本身的某些属性,使其与基类上的属性不同。这是使用
Override
类来完成的。目前,
Override
只能用于覆盖属性的default
值。- 关键字参数:
default (obj) – 子类上此属性的默认值
示例
考虑以下类定义
from bokeh.model import Model from bokeh.properties import Int, Override class Parent(Model): foo = Int(default=10) class Child(Parent): foo = Override(default=20)
父类有一个整数属性
foo
,默认值为 10。子类使用以下代码foo = Override(default=20)
指定子类实例上
foo
属性的默认值应为 20>>> p = Parent() >>> p.foo 10 >>> c = Child() >>> c.foo 20
仅验证属性#
验证控制#a
默认情况下,Bokeh 属性对值执行类型验证。 这有助于确保在 Python 和 JavaScript 之间交换的任何数据的一致性,以及在用户尝试设置错误类型的值时提供详细且及时的反馈。 但是,这些类型检查会带来一些开销。 在某些情况下,可能希望在特定位置或甚至完全关闭验证,以提高性能。 以下 API 可用于控制类型验证何时发生。