494 字
2 分钟
python语法
*args 和**kwargs
def tests(a,b,*args,**kwargs): for arg in args: print(arg) for key in kwargs: print(key,kwargs[key])
test(1,2,3,4,a=1,b=2)# 3,4,a a=1,b b=2
简单来说,args 可以接受任意数量的参数,是以一个 tuple 的形式进行存储的,而**kwargs 是用于接收有参数名的参数的
装饰器
python 的装饰器就是有类似@的形式
首先我们需要认识以下内容
def hi(name="yasoob"): return "hi " + nameprint(hi())# 我们甚至可以将一个函数赋值给一个变量,比如greet = hiprint(greet())# output: 'hi yasoob'del hiprint(hi())#outputs: NameErrorprint(greet())#outputs: 'hi yasoob'
在 python 中函数也是一个对象,了解了这个之后,我们就可以明白如何在函数中返回函数!
def hi(name="yasoob"): def greet(): return "now you are in the greet() function"
def welcome(): return "now you are in the welcome() function"
if name == "yasoob": return greet else: return welcome
此外,函数也可以作为参数被传入另一个函数
def hi(): return "hi yasoob!"
def doSomethingBeforeHi(func): print("I am doing some boring work before executing hi()") print(func())
有了上述知识,我们就可以了解装饰器如何工作的了
def warps(func): def wrapTheFunction(*args,**kwargs): print("1") func(*args,**kwargs) print("2") return wrapTheFunction
def func(): print("1")
func = warps(func)# 这部分类似@warpsdef func(): print("1")print(func.__name__)#这里的名字被warpTheFunction替换了,为了修正,我们需要做出如下更正
from functools import wrapsdef MyWarps(func): @wraps(func) def wrapTheFunction(*args,**kwargs): print("1") func(*args,**kwargs) print("2") return wrapTheFunction
@MyWarpsdef func(): print("a")
Dataclass 注解
假设我们有一个场景,需要一个数据对象来存储一些运动员信息,可以使用 tuple 或者 dict 实现但 tuple 需要记住位置,用 dict 的语法不太优雅,
from dataclasses import dataclass
@dataclassclass Person: name: str age: int
p = Person("John", 36)print(p.name)#这样非常优雅
Python 内置类型
TypedDict: 用于定义带有具体键值对的字典,类似 struct 和 interface
from typing import TypedDict
class Person(TypedDict): name: string age: int
def get_person() -> person: reutrn {"name":"飞白","age":18}
Literal: 表示具体的值而不是类型
def get_status() -> Literal["success","failure"]: reutrn "success"
optional 表示 Union,可以有多个类型
from typing import Optional
def find_item(item_id: int) -> Optional[str]: if item_id == 0: return None return "Item"