python3.8-Python 3.8 有什么新变化

改进的模块?

ast?

AST 节点现在具有 end_lineno 和 end_col_offset 属性,它们给出节点结束的精确位置。 (这只适用于具有 lineno 和 col_offset 属性的节点。)

(由 Ivan Levkivskyi 在 bpo-33416 中贡献。)

ast.parse() 函数具有一些新的旗标:

type_comments=True 导致其返回与特定 AST 节点相关联的 PEP 484 和 PEP 526 类型注释文本;

mode='func_type' 可被用于解析 PEP 484 "签名类型注释" (为函数定义 AST 节点而返回);

feature_version=(3, N) 允许指定一个更早的 Python 3 版本。 例如,feature_version=(3, 4) 将把 async 和 await 视为非保留字。

(由 Guido van Rossum 在 bpo-35766 中贡献。)

asyncio?

asyncio.run() 已经从暂定状态晋级为稳定 API。 此函数可被用于执行一个 coroutine 并返回结果,同时自动管理事件循环。 例如:

import asyncio

async def main():

await asyncio.sleep(0)

return 42

asyncio.run(main())

这 大致 等价于:

import asyncio

async def main():

await asyncio.sleep(0)

return 42

loop = asyncio.new_event_loop()

asyncio.set_event_loop(loop)

try:

loop.run_until_complete(main())

finally:

asyncio.set_event_loop(None)

loop.close()

实际的实现要更复杂许多。 因此 asyncio.run() 应该作为运行 asyncio 程序的首选方式。

(由 Yury Selivanov 在 bpo-32314 中贡献。)

运行 python -m asyncio 将启动一个原生异步 REPL。 这允许快速体验具有最高层级 await 的代码。 这时不再需要直接调用 asyncio.run(),因为此操作会在每次发起调用时产生一个新事件循环:

$ python -m asyncio

asyncio REPL 3.8.0

Use "await" directly instead of "asyncio.run()".

Type "help", "copyright", "credits" or "license" for more information.

>>> import asyncio

>>> await asyncio.sleep(10, result='hello')

hello

(由 Yury Selivanov 在 bpo-37028 中贡献。)

在 Windows 上,现在默认的事件循环为 ProactorEventLoop。 (由 Victor Stinner 在 bpo-34687 中贡献。)

ProactorEventLoop 现在也支持 UDP。 (由 Adam Meily 和 Andrew Svetlov 在 bpo-29883 中贡献。)

ProactorEventLoop 现在可通过 KeyboardInterrupt ("CTRL+C") 来中断。 (由 Vladimir Matveev 在 bpo-23057 中贡献。)

asyncio 任务现在可以被命名,或者是通过将 name 关键字参数传给 asyncio.create_task() 或 create_task() 事件循环方法,或者是通过在任务对象上调用 set_name() 方法。 任务名称在 asyncio.Task 的 repr() 输出中可见,并且还可以使用 get_name() 方法来获取。 (由 Alex Gr?nholm 在 bpo-34270 中贡献。)

将对 Happy Eyeballs 的支持添加到 asyncio.loop.create_connection()。 要指定此行为,已增加了两个新的形参: happy_eyeballs_delay 和 interleave。 Happy Eyeballs 算法可提升支持 IPv4 和 IPv6 的应用的响应速度,具体做法是尝试同时使用两者进行连接。 (由 twisteroid ambassador 在 bpo-33530 中贡献。)

builtins?

内置的 compile() 已改进为可接受 ast.PyCF_ALLOW_TOP_LEVEL_AWAIT 旗标。 当传入此新旗标时,compile() 将允许通常被视为无效语法的最高层级 await, async for 和 async with 构造。 此后将可返回带有 CO_COROUTINE 旗标的异步代码对象。 (由 Matthias Bussonnier 在 bpo-34616 中贡献。)

collections?

collections.namedtuple() 的 _asdict() 方法现在将返回 dict 而不是 collections.OrderedDict。 此项更改是由于普通字典自 Python 3.7 起已保证具有确定的元素顺序。 如果还需要 OrderedDict 的额外特性,建议的解决方案是将结果转换为需要的类型: OrderedDict(nt._asdict())。 (由 Raymond Hettinger 在 bpo-35864 中贡献。)

cProfile?

cProfile.Profile 类现在可被用作上下文管理器。 在运行时对一个代码块实现性能分析:

import cProfile

with cProfile.Profile() as profiler:

# code to be profiled

...

(由 Scott Sanderson 在 bpo-29235 中贡献。)

csv?

csv.DictReader 现在将返回 dict 而不是 collections.OrderedDict。 此工具现在会更快速且消耗更少内存同时仍然保留字段顺序。 (由 Michael Selik 在 bpo-34003 中贡献。)

curses?

添加了一个新变量用于保存下层 ncurses 库的结构版信息: ncurses_version。 (由 Serhiy Storchaka 在 bpo-31680 中贡献。)

ctypes?

在 Windows 上,CDLL 及其子类现在接受 winmode 形参来指定用于底层 LoadLibraryEx 调用的旗标。 默认旗标被设为仅加载来自可信任位置的 DLL 依赖项,包括 DLL 的存放路径(如果加载初始 DLL 时使用了完整或部分路径)以及通过 add_dll_directory() 添加的路径。 (由 Steve Dower 在 bpo-36085 中贡献。)

datetime?

添加了新的替代构造器 datetime.date.fromisocalendar() 和 datetime.datetime.fromisocalendar(),它们分别基于 ISO 年份、周序号和周内日序号来构造 date 和 datetime 对象;这两者分别是其所对应类中 isocalendar 方法的逆操作。 (由 Paul Ganssle 在 bpo-36004 中贡献。)

functools?

functools.lru_cache() 现在可直接作为装饰器而不是作为返回装饰器的函数。 因此这两种写法现在都被支持:

@lru_cache

def f(x):

...

@lru_cache(maxsize=256)

def f(x):

...

(由 Raymond Hettinger 在 bpo-36772 中贡献。)

添加了新的 functools.cached_property() 装饰器,用于在实例生命周期内缓存的已计算特征属性。

import functools

import statistics

class Dataset:

def __init__(self, sequence_of_numbers):

self.data = sequence_of_numbers

@functools.cached_property

def variance(self):

return statistics.variance(self.data)

(由 Carl Meyer 在 bpo-21145 中贡献)

from functools import singledispatchmethod

from contextlib import suppress

class TaskManager:

def __init__(self, tasks):

self.tasks = list(tasks)

@singledispatchmethod

def discard(self, value):

with suppress(ValueError):

self.tasks.remove(value)

@discard.register(list)

def _(self, tasks):

targets = set(tasks)

self.tasks = [x for x in self.tasks if x not in targets]

(由 Ethan Smith 在 bpo-32380 中贡献)

gc?

get_objects() 现在能接受一个可选的 generation 形参来指定一个用于获取对象的生成器。 (由 Pablo Galindo 在 bpo-36016 中贡献。)

gettext?

添加了 pgettext() 及其变化形式。 (由 Franz Glasner, éric Araujo 和 Cheryl Sabella 在 bpo-2504 中贡献。)

gzip?

添加 mtime 形参到 gzip.compress() 用于可重现的输出。 (由 Guo Ci Teo 在 bpo-34898 中贡献。)

对于特定类型的无效或已损坏 gzip 文件现在将引发 BadGzipFile 而不是 OSError。 (由 Filip Gruszczyński, Michele Orrù 和 Zackery Spytz 在 bpo-6584 中贡献。)

IDLE 与 idlelib?

超过 N 行(默认值为 50)的输出将被折叠为一个按钮。 N 可以在 Settings 对话框的 General 页的 PyShell 部分中进行修改。 数量较少但是超长的行可以通过在输出上右击来折叠。 被折叠的输出可通过双击按钮来展开,或是通过右击按钮来放入剪贴板或是单独的窗口。 (由 Tal Einat 在 bpo-1529353 中贡献。)

在 Run 菜单中增加了 "Run Customized" 以使用自定义设置来运行模块。 输入的任何命令行参数都会被加入 sys.argv。 它们在下次自定义运行时会再次显示在窗体中。 用户也可以禁用通常的 Shell 主模块重启。 (由 Cheryl Sabella, Terry Jan Reedy 等人在 bpo-5680 和 bpo-37627 中贡献。)

在 IDLE 编辑器窗口中增加了可选的行号。 窗口打开时默认不显示行号,除非在配置对话框的 General 选项卡中特别设置。 已打开窗口中的行号可以在 Options 菜单中显示和隐藏。 (由 Tal Einat 和 Saimadhav Heblikar 在 bpo-17535 中贡献。)

现在会使用 OS 本机编码格式在 Python 字符串和 Tcl 对象间进行转换。 这允许在 IDLE 中处理 emoji 和其他非 BMP 字符。 这些字符将可被显示或是从剪贴板复制和粘贴。 字符串从 Tcl 到 Python 的来回转换现在不会再发生失败。 (过去八年有许多人都为此付出过努力,问题最终由 Serhiy Storchaka 在 bpo-13153 中解决。)

在 3.8.1 中新增:

添加切换光标闪烁停止的选项。 (由 Zackery Spytz 在 bpo-4603 中贡献。)

Esc 键现在会关闭 IDLE 补全提示窗口。 (由 Johnny Najera 在 bpo-38944 中贡献。)

上述修改已被反向移植到 3.7 维护发行版中。

添加关键字到模块名称补全列表。 (由 Terry J. Reedy 在 bpo-37765 中贡献。)

inspect?

inspect.getdoc() 函数现在可以找到 __slots__ 的文档字符串,如果该属性是一个元素值为文档字符串的 dict 的话。 这提供了类似于目前已有的 property(), classmethod() 和 staticmethod() 等函数的文档选项:

class AudioClip:

__slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',

'duration': 'in seconds, rounded up to an integer'}

def __init__(self, bit_rate, duration):

self.bit_rate = round(bit_rate / 1000.0, 1)

self.duration = ceil(duration)

(由 Raymond Hettinger 在 bpo-36326 中贡献。)

io?

在开发模式 (-X env) 和调试构建中,io.IOBase 终结器现在会在 close() 方法失败时将异常写入日志。 发生的异常在发布构建中默认会被静默忽略。 (由 Victor Stinner 在 bpo-18748 中贡献。)

itertools?

itertools.accumulate() 函数增加了可选的 initial 关键字参数用来指定一个初始值:

>>>from itertools import accumulate

>>>list(accumulate([10, 5, 30, 15], initial=1000))

[1000, 1010, 1015, 1045, 1060]

(由 Lisa Roach 在 bpo-34659 中贡献。)

json.tool?

添加选项 --json-lines 用于将每个输入行解析为单独的 JSON 对象。 (由 Weipeng Hong 在 bpo-31553 中贡献。)

logging?

为 logging.basicConfig() 添加了 force 关键字参数,当设为真值时,关联到根日志记录器的任何现有处理程序都将在执行由其他参数所指定的配置之前被移除并关闭。

这解决了一个长期存在的问题。 当一个日志处理器或 basicConfig() 被调用时,对 basicConfig() 的后续调用会被静默地忽略。 这导致使用交互提示符或 Jupyter 笔记本更新、试验或讲解各种日志配置选项变得相当困难。

(由 Raymond Hettinger 提议,由 Dong-hee Na 实现,并由 Vinay Sajip 在 bpo-33897 中完成审核。)

math?

添加了新的函数 math.dist() 用于计算两点之间的欧几里得距离。 (由 Raymond Hettinger 在 bpo-33089 中贡献。)

扩展了 math.hypot() 函数以便处理更多的维度。 之前它仅支持 2-D 的情况。 (由 Raymond Hettinger 在 bpo-33089 中贡献。)

添加了新的函数 math.prod() 作为的 sum() 同类,该函数返回 'start' 值 (默认值: 1) 乘以一个数字可迭代对象的积:

>>>prior = 0.8

>>>likelihoods = [0.625, 0.84, 0.30]

>>>math.prod(likelihoods, start=prior)

0.126

(由 Pablo Galindo 在 bpo-35606 中贡献。)

>>>math.perm(10, 3) # Permutations of 10 things taken 3 at a time

720

>>>math.comb(10, 3) # Combinations of 10 things taken 3 at a time

120

(由 Yash Aggarwal, Keller Fuchs, Serhiy Storchaka 和 Raymond Hettinger 在 bpo-37128, bpo-37178 和 bpo-35431 中贡献。)

添加了一个新函数 math.isqrt() 用于计算精确整数平方根而无需转换为浮点数。 该新函数支持任意大整数。 它的执行速度比 floor(sqrt(n)) 快但是比 math.sqrt() 慢:

>>>r = 650320427

>>>s = r ** 2

>>>isqrt(s - 1) # correct

650320426

>>>floor(sqrt(s - 1)) # incorrect

650320427

(由 Mark Dickinson 在 bpo-36887 中贡献。)

函数 math.factorial() 不再接受非整数类参数。 (由 Pablo Galindo 在 bpo-33083 中贡献。)

mmap?

mmap.mmap 类现在具有一个 madvise() 方法用于访问 madvise() 系统调用。 (由 Zackery Spytz 在 bpo-32941 中贡献。)

multiprocessing?

在macOS上,现在默认使用的启动方式是*spawn*启动方式。

(由 Victor Stinner 在 bpo-33725 中贡献。)

os?

在 Windows 上添加了新函数 add_dll_directory() 用于在导入扩展模块或使用 ctypes 加载 DLL 时为本机依赖提供额外搜索路径 。 (由 Steve Dower 在 bpo-36085 中贡献。)

添加了新的 os.memfd_create() 函数用于包装 memfd_create() 系统调用。 (由 Zackery Spytz 和 Christian Heimes 在 bpo-26836 中贡献。)

在 Windows 上,大部分用于处理重解析点,(包括符号链接和目录连接)的手动逻辑已被委托给操作系统。 特别地,os.stat() 现在将会遍历操作系统所支持的任何内容,而 os.lstat() 将只打开被标识为"名称代理”的重解析点,而其要由 os.stat() 打开其他的重解析点。 在所有情况下,stat_result.st_mode 将只为符号链接而非其他种类的重解析点设置 S_IFLNK。 要标识其他种类的重解析点,请检查新的 stat_result.st_reparse_tag 属性。

在 Windows 上,os.readlink() 现在能够读取目录连接。 请注意 islink() 会对目录连接返回 False,因此首先检查 islink 的代码将连续把连接视为目录,而会处理 os.readlink() 所引发错误的代码现在会把连接视为链接。

(由 Steve Dower 在 bpo-37834 中贡献。)

os.path?

expanduser() 在 Windows 上现在改用 USERPROFILE 环境变量而不再使用 HOME,后者通常不会为一般用户账户设置。 (由 Anthony Sottile 在 bpo-36264 中贡献。)

isdir() 在 Windows 上将不再为不存在的目录的链接返回 True。

realpath() 在 Windows 上现在会识别重解析点,包括符号链接和目录连接。

(由 Steve Dower 在 bpo-37834 中贡献。)

pickle?

pickle 扩展子类化针对 C 优化的 Pickler 现在可通过定义特殊的 reducer_override() 方法来重载函数和类的封存逻辑。 (由 Pierre Glaser 和 Olivier Grisel 在 bpo-35900 中贡献。)

plistlib?

添加了新的 plistlib.UID 并启动了对读取和写入经过 NSKeyedArchiver 编码的二进制 plists 的支持。 (由 Jon Janzen 在 bpo-26707 中贡献。)

pprint?

pprint 模块为一些函数添加了 sort_dicts 形参。 默认情况下,这些函数会继续在渲染或打印之前对字典进行排序。 但是,如果 sort_dicts 设为假值,则字典将保持键插入时的顺序。 这在调试期间与 JSON 输入进行比较时会很有用。

除此之外,还增加了一个方便的新函数 pprint.pp(),它类似于 pprint.pprint() 但它的 sort_dicts 默认为 False:

>>>from pprint import pprint, pp

>>>d = dict(source='input.txt', operation='filter', destination='output.txt')

>>>pp(d, width=40) # Original order

{'source': 'input.txt',

'operation': 'filter',

'destination': 'output.txt'}

>>>pprint(d, width=40) # Keys sorted alphabetically

{'destination': 'output.txt',

'operation': 'filter',

'source': 'input.txt'}

(由 Rémi Lapeyre 在 bpo-30670 中贡献。)

py_compile?

py_compile.compile() 现在支持静默模式。 (由 Joannah Nanjekye 在 bpo-22640 中贡献。)

shlex?

shutil?

shutil.copytree() 现在接受新的 dirs_exist_ok 关键字参数。 (由 Josh Bronson 在 bpo-20849 中贡献。)

shutil.make_archive() 现在对新的归档默认使用 modern pax (POSIX.1-2001) 格式以提升可移植性和标准一致性,此特性继承自对 tarfile 模块的相应更改。 (由 C.A.M. Gerlach 在 bpo-30661 中贡献。)

shutil.rmtree() 在 Windows 上现在会移除目录连接而不会递归地先移除其中的内容。 (由 Steve Dower 在 bpo-37834 中贡献。)

socket?

添加了便捷的 create_server() 和 has_dualstack_ipv6() 函数以自动化在创建服务器套接字时通常情况下所必须的任务,包括在同一套接字中同时接受 IPv4 和 IPv6 连接。 (由 Giampaolo Rodolà 在 bpo-17561 中贡献。)

statistics?

添加了 statistics.fmean() 作为 statistics.mean() 的更快速的浮点数版版本。 (由 Raymond Hettinger 和 Steven D'Aprano 在 bpo-35904 中贡献。)

添加了 statistics.multimode() 用于返回最常见值的列表。 (由 Raymond Hettinger 在 bpo-35892 中贡献。)

添加了 statistics.quantiles() 用于将数据或分布划分为多个等概率区间(例如四分位、十分位或百分位)。 (由 Raymond Hettinger 在 bpo-36546 中贡献。)

添加了 statistics.NormalDist 用于创建和操纵随机变量的正态分布。 (由 Raymond Hettinger 在 bpo-36018 中贡献。)

>>>temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])

>>>temperature_feb.mean

6.0

>>>temperature_feb.stdev

6.356099432828281

>>>temperature_feb.cdf(3) # Chance of being under 3 degrees

0.3184678262814532

>>># Relative chance of being 7 degrees versus 10 degrees

>>>temperature_feb.pdf(7) / temperature_feb.pdf(10)

1.2039930378537762

>>>el_ni?o = NormalDist(4, 2.5)

>>>temperature_feb += el_ni?o # Add in a climate effect

>>>temperature_feb

NormalDist(mu=10.0, sigma=6.830080526611674)

>>>temperature_feb * (9/5) + 32 # Convert to Fahrenheit

NormalDist(mu=50.0, sigma=12.294144947901014)

>>>temperature_feb.samples(3) # Generate random samples

[7.672102882379219, 12.000027119750287, 4.647488369766392]

sys?

添加了新的 sys.unraisablehook() 函数,可被重载以便控制如何处理"不可引发的异常”。 它会在发生了一个异常但 Python 没有办法处理时被调用。 例如,当一个析构器在垃圾回收时 (gc.collect()) 所引发的异常。 (由 Victor Stinner 在 bpo-36829 中贡献。)

tarfile?

tarfile 模块现在对新的归档默认使用 modern pax (POSIX.1-2001) 格式而不再是之前的 GNU 专属格式。 这通过标准化和可扩展格式的统一编码 (UTF-8) 提升了跨平台可移植性,还提供了其他一些益处。 (由 C.A.M. Gerlach 在 bpo-36268 中贡献。)

threading?

添加了新的 threading.get_native_id() 函数以及 threading.Thread 类的 native_id 属性。 它们会返回内核所分配给当前线程的原生整数线程 ID。 此特性仅在特定平台上可用,参见 get_native_id 了解详情。 (由 Jake Tesler 在 bpo-36084 中贡献。)

tokenize?

当提供不带末尾新行的输入时,tokenize 模块现在会隐式地添加 NEWLINE 形符。 此行为现在已与 C 词法分析器的内部行为相匹配。 (由 Ammar Askar 在 bpo-33899 中贡献。)

tkinter?

在 tkinter.Spinbox 中添加了方法 selection_from(), selection_present(), selection_range() 和 selection_to()。 (由 Juliette Monsel 在 bpo-34829 中贡献。)

在 tkinter.Canvas 类中添加了方法 moveto()。 (由 Juliette Monsel 在 bpo-23831 中贡献。)

tkinter.PhotoImage 类现在具有 transparency_get() 和 transparency_set() 方法。 (由 Zackery Spytz 在 bpo-25451 中贡献。)

time?

为 macOS 10.12 添加了新的时钟 CLOCK_UPTIME_RAW。 (由 Joannah Nanjekye 在 bpo-35702 中贡献。)

typing?

typing 模块加入了一些新特性:

一个带有键专属类型的字典类型。 参见 PEP 589 和 typing.TypedDict。 TypedDict 只使用字符串作为键。 默认情况下每个键都要求提供。 指定 "total=False" 以允许键作为可选项:

class Location(TypedDict, total=False):

lat_long: tuple

grid_square: str

xy_coordinate: tuple

Literal 类型。 参见 PEP 586 和 typing.Literal。 Literal 类型指明一个形参或返回值被限定为一个或多个特定的字面值:

def get_status(port: int) -> Literal['connected', 'disconnected']:

...

"Final" 变量、函数、方法和类。 参见 PEP 591, typing.Final 和 typing.final()。 final 限定符会指示静态类型检查器限制进行子类化、重载或重新赋值:

pi: Final[float] = 3.1415926536

unicodedata?

新的函数 is_normalized() 可被用来验证字符串是否为特定正规形式,通常会比实际进行字符串正规化要快得多。 (由 Max Belanger, David Euresti 和 Greg Price 在 bpo-32285 和 bpo-37966 中贡献。)

unittest?

添加了 AsyncMock 以支持异步版本的 Mock。 同时也添加了相应的断言函数用于测试。 (由 Lisa Roach 在 bpo-26467 中贡献。)

unittest 添加了 addModuleCleanup() 和 addClassCleanup() 以支持对 setUpModule() 和 setUpClass() 进行清理。 (由 Lisa Roach 在 bpo-24412 中贡献。)

一些模拟断言函数现在也会在失败时打印一个实际调用列表。 (由 Petter Strandmark 在 bpo-35047 中贡献。)

示例:

import unittest

class TestRequest(unittest.IsolatedAsyncioTestCase):

async def asyncSetUp(self):

self.connection = await AsyncConnection()

async def test_get(self):

response = await self.connection.get("https://example.com")

self.assertEqual(response.status_code, 200)

async def asyncTearDown(self):

await self.connection.close()

if __name__ == "__main__":

unittest.main()

venv?

现在 venv 在所有平台上都会包含 Activate.ps1 脚本用于在 PowerShell Core 6.1 下激活虚拟环境。 (由 Brett Cannon 在 bpo-32718 中贡献。)

weakref?

由 weakref.proxy() 返回的代理对象现在除其他算术运算符外也支持矩阵乘法运算符 @ 和 @=。 (由 Mark Dickinson 在 bpo-36669 中贡献。)

xml?

作为对 DTD 和外部实体检索的缓解,在默认情况下 xml.dom.minidom 和 xml.sax 模块不再处理外部实体。 (由 Christian Heimes 在 bpo-17239 中贡献。)

xml.etree.ElementTree 模块中的 .find*() 方法支持通配符搜索例如 {*}tag,此搜索会忽略命名空间以及返回给定命名空间中所有标签的 {namespace}*。 (由 Stefan Behnel 在 bpo-28238 中贡献。)

xml.etree.ElementTree 模块提供了实现 C14N 2.0 的新函数 –xml.etree.ElementTree.canonicalize()。 (由 Stefan Behnel 在 bpo-13611 中贡献。)

xml.etree.ElementTree.XMLParser 的目标对象可通过新的回调方法 start_ns() 和 end_ns() 来接受命名空间声明事件。 此外,xml.etree.ElementTree.TreeBuilder 目标可被配置为处理有关注释和处理指令事件以将它们包含在所生成的树当中。 (由 Stefan Behnel 在 bpo-36676 和 bpo-36673 中贡献。)

xmlrpc?

xmlrpc.client.ServerProxy 现在支持可选的 headers 关键字参数作为随同每次请求发送的 HTTP 标头序列。 此特征的作用之一是使得从默认的基础认证升级到更快速的会话认证成为可能。 (由 Cédric Krier 在 bpo-35153 中贡献。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值