ChatGLM3中的一些语法
flyfish
一、@functools.cache
@functools.cache
是 Python 3.9 引入的装饰器,用于实现函数的结果缓存。它的全称是 @functools.cache,能够自动缓存函数调用的结果。
import functools
@functools.cache
def expensive_computation(x):
print(f"Computing {x}...")
return x * x
# 第一次调用时会执行计算并缓存结果
result1 = expensive_computation(4) # 输出: Computing 4...
print(result1) # 输出: 16
# 第二次调用相同输入时直接返回缓存结果
result2 = expensive_computation(4) # 不再输出 "Computing 4..."
print(result2) # 输出: 16
输出
Computing 4...
16
16
二、Python 3.10 之后,通常使用 |
来替代 Union
Union 用于声明参数或返回值可以是多种类型,具体用法是在 typing 模块中导入后,通过 Union[类型1, 类型2, …] 的形式进行使用。在 Python 3.10 之后,通常使用 | 来替代 Union 进行类型注解
# Python 3.10 及以上
def process_data(data: int | str) -> int | str:
if isinstance(data, int):
return data * 2
elif isinstance(data, str):
return data.upper()
result1 = process_data(10) # 返回 20
result2 = process_data("hello") # 返回 "HELLO"
print(result1, result2)
# Python 3.9 及之前
from typing import Union
def process_data(data: Union[int, str]) -> Union[int, str]:
if isinstance(data, int):
return data * 2
elif isinstance(data, str):
return data.upper()
result1 = process_data(10) # 返回 20
result2 = process_data("hello") # 返回 "HELLO"
print(result1, result2)
输出
20 HELLO
20 HELLO
三、typer
Typer 的主要作用:
Typer 通过使用 Python 的类型注解,可以自动推断和处理命令行参数,减少手动解析参数的繁琐代码,从而简化命令行工具的开发。
基于类型注解和函数签名,Typer 会自动生成详尽的命令行帮助文档,无需手动编写。
Typer 利用类型注解自动处理参数的类型转换,并提供详细的错误信息,支持参数验证和转换。
Typer 支持命令行的自动补全功能(如 Bash 或 Zsh),让命令行工具更加友好。
Typer 在命令行中显示清晰易读的错误信息,便于调试和用户理解,美化错误信息。
typer.Typer
typer.Typer 是用于创建命令行应用对象的类,它是整个 Typer 应用的基础。你可以将不同的函数注册为命令,并通过它构建完整的命令行应用。
import typer
# 创建 Typer 实例
app = typer.Typer()
@app.command()
def greet(name: str):
"""
一个简单的问候命令
"""
print(f"Hello, {name}!")
if __name__ == "__main__":
app()
typer.Typer()
:用于创建一个 Typer 应用对象。
@app.command()
:用来将某个函数注册为命令。
typer.Argument
typer.Argument
用于声明命令行的“位置参数”。位置参数是必须提供的,调用命令时,它们根据顺序传递给函数。typer.Argument
允许设置参数类型、默认值、帮助信息等。
用法
import typer
app = typer.Typer()
@app.command()
def greet(name: str = typer.Argument("World")):
"""
打招呼,名字为必选的参数
"""
print(f"Hello, {name}!")
if __name__ == "__main__":
app()
运行命令
python script.py greet Quijote # 输出: Hello, Quijote!
python script.py greet # 输出: Hello, World!
typer.Argument()
:定义一个位置参数,在调用命令时必须按照顺序传递。
name: str = typer.Argument("World")
:为参数设置了默认值,如果不提供参数则会使用 “World”。
typer.Option
typer.Option
用于声明命令行的“选项参数”。选项参数不是必须的,用户可以通过类似 --option
的语法来传递。
import typer
app = typer.Typer()
@app.command()
def greet(name: str, greeting: str = typer.Option("Hello", help="自定义问候语")):
"""
使用自定义问候语
"""
print(f"{greeting}, {name}!")
if __name__ == "__main__":
app()
运行命令
python script.py greet Quijote --greeting "Hi" # 输出: Hi, Quijote!
python script.py greet Quijote # 输出: Hello, Quijote!
greeting: str = typer.Option("Hello")
:定义了一个命令行选项,默认值是 “Hello”。
--greeting "Hi"
:在运行时,用户可以通过 --greeting
来修改问候语。
美化错误信息
import typer
app = typer.Typer(pretty_exceptions_show_locals=True)
@app.command()
def divide(a: int, b: int):
result = a / b # 当 b 为 0 时,这里会抛出异常
print(f"Result: {result}")
if __name__ == "__main__":
app()
假如上面的代码存在1.py文件里
假如运行python 1.py 10 2
输出是Result: 5.0
不传入参数报错
如果运行命令 python 1.py 10 0
,会抛出异常 ZeroDivisionError,输出的错误信息会详细显示局部变量 a 和 b 的值,帮助开发者快速定位问题。
看图,捕获的错误确实很pretty
pretty_exceptions_show_locals=False
的效果
自动生成命令行工具的帮助文档
import typer
# 创建 Typer 应用实例
app = typer.Typer()
# 定义命令
@app.command()
def greet(name: str, formal: bool = typer.Option(False, help="是否以正式方式打招呼")):
"""
向某人打招呼
Args:
name: 要打招呼的人的名字
formal: 是否使用正式的打招呼方式
"""
if formal:
typer.echo(f"Good day, {name}.")
else:
typer.echo(f"Hello, {name}!")
# 运行应用
if __name__ == "__main__":
app()
执行 python 1.py --help