python的这些小知识你注意到了吗?

简介: 本文将对一些小知识进行汇总,这些知识也许你用了 python 很久,但仍然没注意到。

1.操作文件的 x 模式

对文件进行操作的 opend 函数大家都很熟悉,但是你注意到它还有一种模式为 x 吗?

今天闲的无聊,翻了翻 python 的文档(小闫电脑保存的 python 文档为3.8.2版本),然后发现:不光有 a 、w、b 、r 、+ 模式,竟然还有一种模式为 x,下面讲一下吧。

官方文档称:在 3.3 版本中,增加了 x 模式,它表示创建一个文件,如果文件已经存在,会报错 FileExistsError 。还需要注意一点,在 3.3 版本以后,曾经的 IOError 被别名为 OSError。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

2.协程库 asyncio

之前常用第三方库 greentlet 和 gevent 来创建协程,后来在 3.4 版本后,python 自身引入了一个协程库 asyncio 。它用来实现异步 I/O。下面看一下示例代码:

import asyncio
async def main_one():
    print('hello ...')
    await asyncio.sleep(3)
    print('... main_one!')
async def main_two():
    print('hello ...')
    await asyncio.sleep(3)
    print('... main_two!')
# 创建 task 列表。ensure_future() 函数会返回 task 对象
tasks = [asyncio.ensure_future(main_one()),asyncio.ensure_future(main_two())]
# 使用 get_event_loop() 方法创建一个事件循环
loop = asyncio.get_event_loop()
# 多个任务(即 task 列表)使用 wait() 方法执行
# 然后再调用 run_until_complete() 函数将协程注册到事件循环中
loop.run_until_complete(asyncio.wait(tasks))

结果为:

hello ...
hello ...
... main_one!
... main_two!

3.装饰器 wraps

模块 functools 中的 wraps ,会让使用了装饰器的函数伪装的更像原函数,也就是将原函数的属性赋值给使用了装饰器后的原函数。这句话可能比较难理解,我们先来回顾一下什么是装饰器?装饰器就是在不改变现有函数基础上,为函数增加功能的一个函数,它使用闭包来实现。闭包的规则为在函数内部定义了一个函数,内部函数使用了外部函数的变量,外部函数返回了内部函数的引用。有一点需要注意:虽然被装饰器装饰的函数仍然可以使用原名称调用,但是其实质上指向了装饰器的内函数。通过以下示例进行说明:

1) 先来一个普通的装饰器使用示例

# 定义一个装饰器
def eg_decorator(func):
    def wrapper(*args, **kwds):
        print('我是装饰器啊...')
        return func(*args, **kwds)
    return wrapper
# 使用定义的装饰器装饰函数
@eg_decorator
def noname():
    print('我是示例函数噻...')
# 调用函数
noname()
# 打印函数的 __name__ 属性
print(noname.__name__)
"""
结果是:
我是装饰器啊...
我是示例函数噻...
wrapper
"""

可以看到函数 noname() 的属性 __name__ 的值为 wrapper ,即函数 noname() 指向的是装饰器的内函数。

2) 接下来请出今天的主角 wraps:

from functools import wraps  # <-- 导入模块
# 定义一个装饰器
def eg_decorator(func):
    @wraps(func)    # <-- 使用装饰器
    def wrapper(*args, **kwds):
        print('我是装饰器啊...')
        return func(*args, **kwds)
    return wrapper
# 使用定义的装饰器装饰函数
@eg_decorator
def noname():
    print('我是示例函数噻...')
# 调用函数
noname()
# 打印函数的 __name__ 属性
print(noname.__name__)
"""
结果是:
我是装饰器啊...
我是示例函数噻...
noname
"""

可以看到 __name__ 属性的值被修改为函数 noname 自己。

也许大家会问这有什么用?很久很久以前,在一个 Flask 项目中曾经出现过一个 bug :给视图函数添加了自定义的装饰器之后(该装饰器会验证用户是否登录),再用 @app.route("/index") 绑定路径,会报错「你添加路径的视图函数已经绑定了其他路径」。这是因为路径会绑定自定义装饰器的内函数,之前其他视图绑定的其实并不是视图本身,而是自定义装饰器的内函数,这次实质上也去绑定内函数,所以会报错。通过查看底层代码是因为 Flask 的路由地址根据属性 __name__ 绑定视图名称。

相关文章
|
传感器 监控 安全
基于STM32的智能家居安防系统设计与实现
基于STM32的智能家居安防系统设计与实现
1715 1
|
1月前
|
人工智能 JavaScript 安全
Claude Code对接阿里云百炼:Anthropic兼容API完整配置调试实战指南
随着AI辅助编程技术快速迭代,Claude Code凭借强大的文件读写、终端命令执行、多轮智能体循环能力,成为终端环境下热门的AI编程工具。但是原生版本默认调用海外官方模型接口,对于国内开发者而言,会面临网络访问不稳定、请求超时、调用成本高昂、数据合规风险等一系列现实阻碍。阿里云百炼大模型服务平台推出Anthropic协议兼容接口,无需修改Claude Code工具源代码,就可以将底层推理模型无缝替换为通义千问系列,实现国内网络环境稳定访问、调用成本可控、满足国内数据合规要求的AI编程工作流。本文将从接口接入底层原理、前期环境准备、两套配置实现方式、功能验证、性能成本优化、高频故障排查、企业级
379 0
|
2月前
|
人工智能 缓存 前端开发
AI 长篇小说创作管理开源软件:织叙工作台的设定数据与创作工作流设计
织叙工作台是面向长篇创作的开源 Web 平台,以结构化设定、章节编辑、剧情分析和可选向量记忆组织小说生产流程,支持 Docker Compose 与本地部署。
|
3月前
|
机器学习/深度学习 人工智能 缓存
阿里云百炼产品月报【2026年6月】
阿里云百炼本月重磅升级:Qwen3.7系列模型发布,HappyHorse-1.1上线;PTU能力增强,支持长上下文与多轮对话;新增费用概览看板及3款MCP服务;应用广场上新60+模板,覆盖短剧、写真、工业图纸识别等场景。
756 1
|
9月前
|
Web App开发
代理ip在浏览器的配置指南
本文分三步详解代理IP配置:①打开浏览器对应设置(Chrome设为“设置”,Firefox为“选项”,Edge为“Internet选项”);②在“局域网设置”中填写代理IP与端口并保存;③百度搜“IP”验证是否生效。附注意事项及稳定IP推荐,操作清晰易上手。
|
数据可视化 BI API
无缝对接云数据库:自定义报表生成工具在混合云环境下的部署指南
自定义报表生成工具通过拖拽设计、多数据源整合及自动化输出,帮助业务人员零代码创建个性化报表,解决传统工具灵活性不足、技术门槛高的问题。文章对比其与传统报表差异,列举行业应用场景(如财务、零售),并给出选型建议与主流工具(如FineReport、Power BI、板栗看板)的优劣势分析。
554 0
|
12月前
|
人工智能 运维 安全
Arista VeloCloud SD-WAN 6.4 - 领先的 SD-WAN 解决方案
Arista VeloCloud SD-WAN 6.4 - 领先的 SD-WAN 解决方案
343 2
Arista VeloCloud SD-WAN 6.4 - 领先的 SD-WAN 解决方案
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
1250 9
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
1096 12
|
人工智能
如何布局歌词结构:写歌词的技巧大公开,妙笔生词AI智能写歌词软件
在歌词创作中,结构布局如同建筑的骨架,决定歌词的稳固与美感。本文揭示了歌词结构布局的奥秘,从吸引人的开头、核心的中间部分到点睛的结尾,帮助你写出动人歌词。此外,推荐使用《妙笔生词智能写歌词软件》,其多种 AI 功能可助你一臂之力。