【Python 程序设计】Python 中的类型提示【06/8】
目录
一、说明
二、什么是动态类型?
2.1 为什么要使用类型提示?
2.2 局限性
三、基本类型提示
3.1 声明变量的类型
3.2 函数注释
四、Python 中的内置类型
4.1 原子类型与复合类型
五、函数注释
5.1 如何指定函数的参数类型和返回类型
5.2 在函数签名中使用类型提示的示例
六、复杂类型
6.1 列表、字典、元组、集合
6.2 自选
6.3 联合
6.4 任何
七、用户定义的类型
7.1 使用类定义自己的类型
7.2 用于类型提示Type
7.3 用于创建不同类型NewType
八、泛 型
8.1 类型变量
8.2 通用
九、类型检查pyright
9.1 如何使用类型检查器验证您的类型
9.2 静态与动态类型检查
十、类型提示和文档字符串
十一、结论
一、说明
Python为促进清晰可靠的代码而提供的强大工具之一是“类型提示”的概念。你可能想知道,“Python是一种动态类型的语言,那么我为什么要为类型而烦恼呢?"
作为对编码最佳实践感兴趣的数据工程师或 Python 初学者,理解和应用 Python 代码中的类型提示可能是一项真正的资产。
在本文中,我们将更深入地探讨类型提示、它们的应用以及它们在 Python 编程中的优势。由于 Dagster 是一个类型注释框架,我们还将解释如何在数据工程管道中使用类型来提高其可读性并使其不易出错。这就像为你未来的自己和其他可能与你的代码交互的开发人员提供一个映射 - 一个详细说明流入和流出你的函数和类的数据类型的映射。
二、什么是动态类型?
Python是一种动态类型的语言。在 Java 或 C++ 等静态类型语言中,您必须在使用变量之前声明变量的类型。例如,您需要指定变量是整数、浮点数、字符串等。在 Python 中,你可以在运行时之前不考虑数据类型的情况下进行编码——这是使 Python 特别适合初学者的功能之一。
例如,您可以声明一个变量并直接为其赋值,而无需指定其类型,因此称为“动态类型”。Python 解释器在运行时隐式绑定值及其类型。
x = 10 # x is an integer
x = "Hello" # now x is a string
在第一行中,是一个整数。在第二行中,相同变为字符串。由于其动态类型特性,Python 可以无缝地处理这种转换。x
x
但是,这种动态特性也可能导致难以调试的错误,尤其是在大型代码库或复杂的数据处理管道中,其中数据流可能不会立即明显。
Python 3.5 中通过 PEP 484 作为标准库的一部分引入的类型提示允许您指定变量、函数参数或返回值的预期类型。
2.1 为什么要使用类型提示?
虽然动态类型提供了灵活性,但它也为潜在的错误创造了空间。这就是类型提示的用武之地。它们可以显著增强代码可读性并防止与类型相关的错误。
改进了代码可读性:类型提示充当一种文档形式,可帮助开发人员了解函数期望的参数类型及其返回的内容。这种增强的清晰度使代码更具可读性和更易于理解。
错误检测:像“pyright”这样的工具,可以用来静态分析你的Python代码。它根据类型提示检查代码中类型的一致性,并在运行时之前提醒您与类型相关的错误。了解为什么Dagster团队建议完全跳过mypy,只使用pyright。mypy
更好的 IDE 支持:许多集成开发环境 (IDE) 和 linter 可以利用类型提示来提供更好的代码完成、错误检查和重构。
促进大型项目:对于具有多个开发人员的大型项目,类型提示对于理解整个代码库的数据结构和流非常有益。我们发布了有关如何包含和维护公共 Python 项目类型注释的指南。
2.2 局限性
运行时未强制执行: Python 的类型提示不是强制执行的,而只是提示,如果提供的类型与实际值不匹配,Python 解释器不会引发错误。这可能会导致一种误解,即类型提示可以强制实施类型安全,而它们不能强制执行。
过于复杂:对于小型或简单的脚本,类型提示可能看起来有点矫枉过正,并且可能会使本应简单明了的代码复杂化。
不灵活:Python受欢迎的原因之一是它的动态性质和类型提示可以限制这一点。
三、基本类型提示
Python 的模块包含多个函数和类,用于为 Python 代码提供类型提示。下面介绍如何在不同方案中应用类型提示。typing
3.1 声明变量的类型
若要为变量提供类型提示,可以使用冒号符号后跟类型。下面是一个示例::
age: int = 20
name: str = "Alice"
is_active: bool = True
此处提示为整数、字符串和布尔值。age
name
is_active
3.2 函数注释
可以为函数参数和返回值提供类型提示。这有助于其他开发人员了解函数需要哪些类型的参数以及函数返回的类型。
def greet(name: str) -> str: \ return f"Hello, {name}
"
在此示例中,函数期望是一个字符串,并将返回一个字符串。
四、Python 中的内置类型
Python 有几种内置类型。最常用的是:
int
:表示一个整数float
:表示浮点数bool
:表示布尔值(真或假)str
:表示字符串
还有一些复杂的类型,如列表、元组和字典,可用于提供更详细的类型提示,我们将在后面看到这些提示。
您还可以在附录中找到 Python 主要类型的列表。
4.1 原子类型与复合类型
在 Python 中,在类型提示方面,原子类型和复合类型之间存在区别。原子类型(如 、 和 )是简单且不可分割的,它们的类型注释可以直接使用类型本身提供,例如 。int
float
str
str
def my_function(my_string: str) -> int:return len(my_string)
另一方面,复合类型喜欢 和 由其他类型组成,在 Python 3.9 之前,它们通常需要从类型模块导入特定的定义,例如整数列表。List
Dict
typing.List[int]
from typing import Listdef my_function(numbers: List[int]) -> int:return sum(numbers)
在较新版本的 Python 中,您可以编写而不是 .list[str]
typing.List[int]
五、函数注释
类型提示在合并到函数签名中时特别有用。这不仅允许开发人员了解函数需要什么类型的参数,还可以让他们了解函数将返回什么。
5.1 如何指定函数的参数类型和返回类型
可以使用参数的符号和返回类型的符号来指定参数类型和函数的返回类型。下面是一般语法::
->
def function_name(arg1: type1, arg2: type2, ...) -> return_type:# function body
在此语法中,、、等是函数参数,、 等是这些参数的类型。 是函数返回的值的类型。arg1
arg2
type1
type2
return_type
5.2 在函数签名中使用类型提示的示例
让我们考虑一个计算矩形面积的函数:
def area_rectangle(length: float, breadth: float) -> float:return length * breadth
在此函数中,并且预期为浮点数,并且该函数还返回浮点数。如果传递可以转换为浮点数的整数甚至字符串,该函数仍将有效,但类型提示清楚地表明它旨在处理浮点数。length
breadth
另一个示例可以是接受整数列表并将其总和作为整数返回的函数:
def sum_elements(numbers: list[int]) -> int:return sum(numbers)
在此示例中,参数提示为整数列表,返回类型为整数。numbers
请注意,这些类型提示不会在运行时强制进行类型检查。它们是对开发人员的提示,如果实际类型与指定类型不匹配,Python 不会引发 a。TypeError
六、复杂类型
Python 中的类型模块提供了几个类,可用于提供更复杂的类型提示。以下是一些最常用的类:
6.1 列表、字典、元组、集合
、、 和类可用于分别为列表、字典、元组和集合提供类型提示。可以对它们进行参数化,以提供更详细的类型提示。list
dict
tuple
set
# A list of integers
numbers: list[int] = [1, 2, 3]# A dictionary with string keys and float values
weights: dict[str, float] = {"apple": 0.182, "banana": 0.120}# A tuple with an integer and a string
student: tuple[int, str] = (1, "John", "True")# A set of strings
flags: set[str] = {"apple", "banana", "cherry"}
在这些示例中,提示为整数列表,是具有字符串键和浮点值的字典,是包含整数和字符串的元组,并且是一组字符串。numbers
weights
student
flags
6.2 自选
类型提示可用于指示变量可以是特定类型或 。Optional
None
from typing import Optionaldef find_student(student_id: int) -> Optional[dict[str, str]]:# If the student is found, return a dictionary containing their data# If the student is not found, return None
6.3 联合
类型提示用于指示变量可以是几种类型之一。例如,如果变量可以是 a 或 ,则可以提供如下类型提示:Union[
str,
int]
from typing import Uniondef process(data: Union[str, int]) -> None:# This function can handle either a string or an integer
在较新版本的 Python 中,您可以使用管道 (|) 运算符来指示可以是多个选项之一的类型,从而替换了对 的需求:Union
def process(data: str | int) -> None:# This function can handle either a string or an integer
6.4 任何
该类用于指示变量可以是任何类型的变量。这相当于根本不提供类型提示。Any
from typing import Anydef process(data: Any) -> None:# This function can handle data of any type
模块中的这些工具可以帮助您提供详细的类型提示,使代码更易于理解和调试。typing
但是,请记住,Python 的类型提示是可选的,不会在运行时强制执行。它们旨在作为开发人员的工具,而不是强制类型安全的方法。
七、用户定义的类型
在 Python 中,您可以使用类定义自己的类型,这是创建自定义类型的基本机制。可以在类型提示中使用这些类,就像使用内置类型一样。该模块还提供了用于创建更具体类型的其他工具,包括 和 。typing
Type
NewType
7.1 使用类定义自己的类型
您可以创建一个类并将其用作类型提示。下面是一个示例:
class Student:def __init__(self, name: str, age: int):self.name = nameself.age = agedef print_student_details(student: Student) -> None:print(student.name, student.age)
Student
是用户定义的类型,它用作函数中的类型提示。print_student_details
7.2 用于类型提示Type
模块中的类可用于指示变量将是一个类,而不是类的实例。当函数参数预期为类时,例如在工厂函数中,通常使用此方法。Type
typing
<span style="color:#3a3631"><span style="background-color:#faf9f7"><span style="background-color:#3a3631"><span style="color:#dad8d6"><code>from typing import Typedef create_student(cls: Type[Student], name: str, age: int) -> Student:return cls(name, age)
</code></span></span></span></span>
在此示例中,期望一个类(或 的子类)作为其第一个参数。create_student
Student
Student
7.3 用于创建不同类型NewType
NewType
用于创建不同的类型。当您想要区分两种本来相同的类型时,它很有用。
例如,假设您正在处理程序中的学生 ID 和课程 ID,并且您希望确保不会将它们混淆。两者都表示为整数,因此您可以使用创建两种不同的类型:NewType
from typing import NewTypeStudentID = NewType('StudentID', int)
CourseID = NewType('CourseID', int)def get_student(student_id: StudentID) -> None:# Fetch student data...def enroll_in_course(student_id: StudentID, course_id: CourseID) -> None:# Enroll the student in the course...
尽管 和 都是整数,但它们也被视为不同的类型,不能互换使用。但是,请记住,此检查不是在运行时强制执行的,而是在静态类型检查期间使用诸如 .StudentID
CourseID
mypy
八、泛 型
泛型允许您定义适用于不同类型的函数、类或数据结构。模块中的类和函数用于定义泛型类型。例如,列表是一种通用数据结构,因为它可以包含任何类型的元素。Generic
TypeVar
typing
8.1 类型变量
TypeVar 用于定义类型变量,该变量可以是任何类型,具体类型由客户端代码确定。下面是一个示例:
from typing import TypeVarT = TypeVar('T')def first_element(lst: List[T]) -> T:return lst[0]
这里,是一个类型变量,可以是任何类型。该函数处理任何类型的列表,并返回该类型的元素。的具体类型将由传递给函数的列表决定。T
first_element
T
8.2 通用
Generic
用于定义泛型类。泛型类可以使用多种类型进行初始化,这些类型用于类中的类型提示中。
from typing import Generic, TypeVarT = TypeVar('T')class Box(Generic[T]):def __init__(self, value: T):self.value = valuedef get(self) -> T:return self.value
这里,是一个适用于任何类型的泛型类。创建 的实例时,可以指定 的类型,该类型将在属性和方法中使用。Box
T
Box
T
value
get
box1 = Box[int](10)
box2 = Box[str]("Hello")
box1
是包含整数的 a,是包含字符串的 a。Box
box2
Box
九、类型检查pyright
像这样的类型检查器是一种用于在 Python 中强制执行类型提示的工具。在Dagster,我们真的很喜欢pyright,因为它比其他替代品更快,例如。pyright
mypy
Python 本身是一种动态类型语言,这意味着类型检查在运行时进行,并且不强制执行类型提示规则。如果尝试执行给定数据类型不支持的操作,Python 将在运行时引发错误。例如,在对象上调用未定义的方法只会在运行时触发错误。
但是,在开发大型或复杂系统时,强制实施类型一致性有助于及早发现潜在的 bug。 执行静态类型检查,这意味着它在实际运行代码之前检查变量、函数参数和返回值的类型。它使用你在代码中提供的类型提示来执行此操作。重要的是要了解它不会执行或运行您的代码;它只是读取和分析它。pyright
pyright
9.1 如何使用类型检查器验证您的类型
要使用 ,您首先需要安装它:pyright
pip install pyright
然后,要检查 Python 文件,请将该文件作为参数运行:pyright
pyright my_file.py
然后,Pyright将分析该文件并报告它发现的任何类型错误。
例如,如果您有一个被注释为str
接收 a 作为参数的函数,并且您传递了一个int
,pyright
将捕获此参数。
9.2 静态与动态类型检查
静态类型检查是基于对程序文本(源代码)的分析来验证程序的类型安全性的过程。静态类型检查在编译时(在程序运行之前)完成。强制静态类型检查的语言包括C++、Java 和 Rust。
另一方面,动态类型检查是在运行时验证程序的类型安全性的过程。动态类型检查在程序运行时进行。使用动态类型检查的语言包括 Python、Ruby 和 JavaScript。
在静态类型检查中,在程序运行之前检查类型,这样可以更轻松地捕获和防止类型错误。这使得程序运行起来更安全,因为大多数与类型相关的错误都是在编译时捕获的。但是,它也要求程序员显式声明所有变量和函数返回值的类型,这可以被视为降低了灵活性。
动态类型检查提供了更大的灵活性,因为您不必显式声明每个变量的类型。但是,这也意味着在运行时可能发生类型错误,这可能会导致程序崩溃。
Python 是一种动态类型语言,但它也支持通过 和 类型提示等工具进行可选的静态类型检查。这为Python程序员提供了独特的灵活性,允许他们选择何时需要静态类型检查的安全性以及何时喜欢动态类型的灵活性。pyright
十、类型提示和文档字符串
正如我们所讨论的,类型提示指示变量、函数参数和返回值的类型。它们可以帮助其他开发人员了解您的函数需要哪些类型的数据以及它将返回什么。
另一方面,文档字符串用于提供函数、类或模块的功能描述。文档字符串可以包含对函数用途、参数、返回值以及可能引发的任何异常的描述。
下面是如何同时使用类型提示和文档字符串的示例:
def filter_and_sort_products(products: list[dict[str, int]], attribute: str, min_value: int) -> list[dict[str, int]]:"""Filters a list of products by a given attribute and minimum value, and then sorts the filtered products by the attribute.Args:products (list[dict[str, int]]): A list of products represented as dictionaries.attribute (str): The attribute to filter and sort by.min_value (int): The minimum acceptable value of the specified attribute.Returns:list[dict[str, int]]: A list of filtered and sorted products.Raises:KeyError: If the specified attribute is not found in any product.Examples:>>> products = [{"name": "Apple", "price": 10}, {"name": "Banana", "price": 5}]>>> filter_and_sort_products(products, "price", 6)[{"name": "Apple", "price": 10}]"""filtered_products = [product for product in products if product[attribute] >= min_value]return sorted(filtered_products, key=lambda x: x[attribute])
在这里,函数签名显示该函数采用表示产品的字典列表、表示属性的字符串和表示最小值的整数。它返回经过筛选和排序的词典的列表。
doc 字符串解释了函数的用途、参数、返回值、可能的异常(例如,如果给定属性不存在),并包括如何调用函数的示例。KeyError
类型提示和文档字符串的这种组合可以大大提高代码的可读性和可维护性。
十一、结论
在 Python 编程最佳实践的基础上,我们研究了类型提示如何提高代码的可读性和可维护性。
如果您有任何问题或需要进一步澄清,请随时加入 Dagster Slack 并向社区寻求帮助。感谢您的阅读!
相关文章:
【Python 程序设计】Python 中的类型提示【06/8】
目录 一、说明 二、什么是动态类型? 2.1 为什么要使用类型提示? 2.2 局限性 三、基本类型提示 3.1 声明变量的类型 3.2 函数注释 四、Python 中的内置类型 4.1 原子类型与复合类型 五、函数注释 5.1 如何指定函数的参数类型和返回类型 5.2 在函数签名中…...
78 # koa 中间件的实现
上上节实现了上下文的,上一节使用了一下中间件,这一节来实现 koa 的中间件这个洋葱模型。 思路: 储存用户所有的 callback将用户传递的 callback 全部组合起来(redux 里的 compose)组合成一个线性结构依次执行&#…...
国产操作系统麒麟v10中遇到的一些问题
下载pycharm:直接在应用商店 目标:主机1安装了虚拟机,主机2要ping通主机1安装的虚拟机。 前提:主机1,主机2在同一局域网下,同一网段。 网络配置 因为虚拟机的网段不在局域网网段内,局域网下…...
Gridea+GitPage+Gittalk 搭建个人博客
👋通过GrideaGitPage 搭建属于自己的博客! 👻GitPage 负责提供 Web 功能! 😽Gridea 作为本地编辑器,方便 push 文章! 🏷本文讲解如何使用 GrideaGitPage 服务域名(可选&a…...
代码质量保障第2讲:单元测试 - 浅谈单元测试
代码质量保障第2讲:单元测试 - 浅谈单元测试 本文是代码质量保障第2讲,浅谈单元测试。单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这是基础,所以围绕着单元测试,我从…...
“五度晟企通”企业发展服务平台正式发布,帮扶企业行稳致远!
在数字中国建设的大背景下,“五度易链”以企业实际发展需求为牵引,以帮扶企业行稳致远为目标,基于全体量产业大数据,运用NLP、AI等新一代信息技术,打造了数字化ToB企业发展服务平台“五度晟企通”,旨在以数…...
Java类和对象(七千字详解!!!带你彻底理解类和对象)
目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象和面向过程 (1)传统洗衣服的过程 (2)现代洗衣服过程 编辑 二、类的定义和使用 1、类的定义格式 三、类的实例化 1、什么是实例化 2、类和对象说明 四、t…...
机器学习笔记:node2vec(论文笔记:node2vec: Scalable Feature Learning for Networks)
2016 KDD 1 intro 利用graph上的节点相似性,对这些节点进行embedding 同质性:节点和其周围节点的embedding比较相似 蓝色节点和其周围的节点结构等价性 结构相近的点embedding相近 比如蓝色节点,都处于多个簇的连接处 2 随机游走 2.1 介绍…...
go基础10 -字符串的高效构造与转换
前面提到过,Go原生支持通过/操作符来连接多个字符串以构造一个更长的字符串,并且通过/操作符的字符串连接构造是最自然、开发体验最好的一种。 但Go还提供了其他一些构造字符串的方法,比如: ● 使用fmt.Sprintf; ● 使…...
VR钢铁实训 | 铁前事业部虚拟仿真培训软件
随着科技的发展,虚拟现实技术在各个行业中的应用越来越广泛。在钢铁冶炼行业中,VR技术也逐渐得到了应用,其中铁前事业部虚拟仿真培训软件就是一项非常有优势的技术。 铁前事业部虚拟仿真培训软件是广州华锐互动打造的《钢铁生产VR虚拟培训系统…...
DevOps
DevOps 是开发 (Dev) 和运营 (Ops) 的复合词,它将人、流程和技术结合起来,不断地为客户提供价值。 DevOps 对团队意味着什么? DevOps 使以前孤立的角色(开发、IT 运营、质量工程和安全)可以协调和协作,以生…...
IJ中PHP环境的搭建和使用教程
目录 目录 前言 思维导图 1,PHP环境下载 1.下载链接 2.进行安装 3,自定义路径 4.进行相关的一些库的选择下载 2,进行IJ中PHP环境的配置 2.1,下载PHP插件 2.2,下载过程中的注意事项 3,为什么这么做呢? 3.1,原因 3.2,进行代码…...
java开发之个人微信的二次开发
简要描述: 修改我在某群的昵称 请求URL: http://域名/updateIInChatRoomNickName 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参…...
ISYSTEM调试实践11-Profiler Timeline和软件运行时间分析
一 前言 本文主要内容是讨论嵌入式软件的时间分析,供大家探讨,如果有疑问欢迎探讨。 对于汽车软件,往往对执行的时序和代码运行的时间有着严格要求。对于在主循环内执行的任务函数,不论是手写还是Autosar生成,能否节拍执行到&…...
第十八章 ObjectScript - 使用例程
文章目录 第十八章 ObjectScript - 使用例程例程Procedures, Functions, and Subroutines 过程、函数和子程序procedurefunctionsubroutine 第十八章 ObjectScript - 使用例程 例程 可以将例程视为 ObjectScript 程序。例程可以从头开始编写,也可以在编译类时自动…...
Linux中select poll和epoll的区别
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用࿰…...
新知同享|Cloud 开发加速创新,更加安全
谷歌在云平台中深度集成了生成式 AI 功能 帮助出海企业及开发者 轻松借力 AI 推动和实现创新 一起来看 2023 Google 开发者大会上 Google Cloud 如何加速创新,加强信息安全 关注 Google Cloud 的 3 个 AI 重点发展领域 了解生成式 AI 功能如何助推创意落地 精彩大会…...
el-form内容重置(解决点击保存关闭后再点击新增会有编辑携带的数据的问题)
主要代码: this.$refs[ruleForm].resetFields() <template><div class"add-edit-coupon"><el-dialog title"商品优惠券" top"10vh" :visible.sync"dialogVisible" width"660px" :before-close&…...
怎样吃透一个java项目?
前言 对于刚开始看视频敲代码,最忌讳的便是一上来就完全照着视频做,这么做就算完完全全的跟着视频做出来一个项目,始终都无法将里面具体的知识化为己有,单纯来说只是简单的复刻,视频的作者本身是不会对他在做该项目过…...
linux 网络命令
网络命令 配置ip 配置ip有两种方式 #方式一#setup可以使用配置工具进行配置setup#方式二 linux服务器默认网卡配置文件的目录/etc/sysconfig/network-scripts,进行配置网卡的配置文件类型- ifcfg-ethX 有线网卡的配置文件,eth0表示第一块网卡,eth1表示第…...
QUIC协议科普导入(一)
一:QUIC协议导入 QUIC是一个通用的传输层网络协议,最初由Google的Jim Roskind设计,2012年实现并部署,2013年随着实验范围的扩大而公开发布,并向IETF描述。虽然长期处于互联网草案阶段,但在从Chrome浏览器到…...
matlab 矩阵逆运算的条件数
目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述 条件数法是目前应用最为广泛的一种病态诊断方法。一个方阵…...
[构建自己的 Vue 组件库] 小尾巴 UI 组件库
文章归档于:https://www.yuque.com/u27599042/row3c6 组件库地址 npm:https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee:https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee:…...
由于电脑出现msvcr110.dll提示错误的解决方法
最近,我在尝试运行一款新的软件时,突然遇到了一个错误提示,提示说缺少msvcr110.dll文件,导致软件无法启动。在使用电脑过程中,我们常常会遇到一些系统文件丢失的问题。其中,msvcr110.dll是Windows操作系统中…...
[LINUX使用] iptables tcpdump wireshark tshark
iptables: 收到来自 10.10.10.10 的数据后都丢弃 iptables -I INPUT -s 10.10.10.10 -j DROP 直接 reject 来自 10.10.10.* 网段的数据 iptables -I INPUT -s 10.10.10.0/24 -j REJECT tcpdump: dump eth0的数据到本地 tcpdump -i eth0 -w dump.pcap 只抓 目的地址是 10…...
显示器鼠标滚动时或者拖拽文字变为绿色
新电脑,新显示器,看文章时滚动鼠标滑轮,文字颜色就变为绿色。 拖住文本文档或者浏览器等有文字的窗口,文字也会变为绿色。 静止时一点儿问题没有。 以下视频展示滚动和拖拽的操作,视频看不出变色,只参考…...
高校网络安全体系建设及零信任安全架构应用的探索
网络安全是高校信息化建设的重中之重,它同时也随着高校信息化的快速发展而不断面临新的挑战。因此,要用发展的眼光去看待网络安全,体系化推进网络安全体系建设。山东师范大学校园信息化经过10多年的建设发展,在网络安全上探索出了…...
Android Studio设置
Android Studio设置 一、主题 1.下载插件并重启 Material Theme UI 2.下载插件ChroMATERIAL 3.设置主题File >> Settings >> Editor >> Colors Scheme >> Scheme >> ChroMATERIAL 4.设置logcat色值File → Settings → Editor → Colors Schem…...
【RabbitMQ】介绍及消息收发流程
介绍 RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实…...
如何预防最新的Mallox变种malloxx勒索病毒感染您的计算机?
导言: 在数字时代, .malloxx 勒索病毒的威胁一直悬在我们头上,如何应对这种威胁,以及在数据被勒索后如何恢复它们,都是备受关注的话题。本文91数据恢复将向您介绍 .malloxx 勒索病毒的独特工作方式,提供与众…...
如何设公司产品购物网站/网站建设公司地址在哪
2019独角兽企业重金招聘Python工程师标准>>> 官方地址:http://jquery.malsup.com/block/ 需要使用的js 引入jquery包 引入插件包JQuery BlockUI(官方下载相应的js) demo 1.直接弹出提示话语 <!DOCTYPE html PUBLIC "-//W…...
linux做网站/代发新闻稿最大平台
Jquery 模板插件 jquery.tmpl.js 的使用方法(1):基本语法,绑定,each循环,ajax获取json数据jquery.tmpl.js 是一个模板js ,主要有2个方法 (1):$.template()方法,将一段script或者是Html编译…...
淘宝做网站/希爱力双效片
第1章:智能音箱行业界定及发展环境剖析1.1 智能音箱行业界定及统计说明 1.1.1 音箱的界定及分类 (1)音箱的定义 (2)音箱主要分类 1.1.2 智能音箱的界定与分类 (1)产品界定 (2&a…...
网站建设时间表/今天热点新闻
年终奖是很多人的快乐,也是很多人的痛。 当然快乐与你有没有缘,就要看快乐与你有没有缘了,这是个玄学。 在一些公司是如果一个人有年终奖其他人就会都有,在一些公司是根据你整年的表现来的。 比如有这么一家公司: …...
个人可以做b2b网站/今日头条官网首页
1 、 所用知识 须知,要达到分页效果,所以会用到UIScrollView的ContentOffset属性,设置其UIScrollView分页移动位置,要有页码就用到了UIPageControl控件显示页码条,而且不要开始不要忘记了设置UIScrollView的属性Conten…...
叫人做网站要注意/爱站工具网
原文地址:https://www.cnblogs.com/suncj/p/4030975.html 一.删除模板片段使用th:remove属性 th:remove的值如下: 1.all:删除包含标签和所有的孩子。 2.body:不包含标记删除,但删除其所有的孩子。 3.tag:包含标记的删除,但不删除它的孩子。 4.all-but-first:删除所有…...