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 " + name
print(hi())
# 我们甚至可以将一个函数赋值给一个变量,比如
greet = hi
print(greet())
# output: 'hi yasoob'
del hi
print(hi())
#outputs: NameError
print(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)
# 这部分类似
@warps
def func():
print("1")
print(func.__name__)#这里的名字被warpTheFunction替换了,为了修正,我们需要做出如下更正
from functools import wraps
def MyWarps(func):
@wraps(func)
def wrapTheFunction(*args,**kwargs):
print("1")
func(*args,**kwargs)
print("2")
return wrapTheFunction
@MyWarps
def func():
print("a")
Dataclass 注解
假设我们有一个场景,需要一个数据对象来存储一些运动员信息,可以使用 tuple 或者 dict 实现但 tuple 需要记住位置,用 dict 的语法不太优雅,
from dataclasses import dataclass
@dataclass
class 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"