python参数注解

Python参数注解主要用于声明函数输入和返回值类型,虽然不强制约束,但在IDE中能提供类型检查。本文介绍了参数注解的目的,使用inspect模块检查函数签名,以及functools.partial的运用。通过装饰器实现参数类型判断,确保函数接收正确类型的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python参数注解

使用环境

def add(x:int, y:int) -> int:
    return x + y

不具有强制的约束力,仅仅只声明一下,对于结果的输出没有任何影响
-> int:表示对于返回值的声明,是一个整型

或者是在函数内部进行注解:

def add(x,y):
    """
    x : int
    y : int
    return int
    """
    return x + y

但是程序员都比较懒,不愿意去做大量的注解,而且函数被调用后有可能还进行修改,这种在内部做注解的方法太麻烦。还不如直接告诉用户需要什么类型的参数。
在IDE环境中进行代码编写时:

def add(x:int, y:int) -> int:
    return x + y

print(add(4, 5))
print(add('4', '5'))
print(add([4], [5]))
def add(x:int, y:int) ->int:
    """
    :param x: int
    :param y: int
    return: int
    
    add function
    """
    return x + y
print(add.__name__,add.__doc__)
print('-' * 30)
print(add.__annotations__)

add(4,5)

#运行后输出的结果为:

add 
    :param x: int
    :param y: int
    return: int
    
    add function
    
------------------------------
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

9

在声明过参数类型后,输入的参数假如不是声明的int类型时,IDE会在不为int的参数上面做一个提醒,但是不会影响任何运行过程和结果。因为python是动态语言
所以靠解释文档来解决函数的参数输入类型问题不好。老项目继续用2.x的版本,新项目建议用3.4以上的版本。

python注解的目的

对于用户输入的参数做一个界限,符合条件的输入进去是可以运行的,不符合的返回一个提示或者报错,并且可以对多数函数适用,那么就可以利用装饰器来写一个判断参数类型的函数。(例: if instance(x, int): #判断 x 是不是 int)

inspect

用到inspect模块做判断

import inspect
inspect.insclass(int)

True

signature

查看函数的签名

inspect.signature(add) # 查看add函数的签名
<Signature (x:int, y:int) -> int>

查看add的参数:

sig = inspect.signature(add)
sig.parameters
mappingproxy({'x': <Parameter "x:int">, 'y': <Parameter "y:int">})

不判断返回值,一般参数的类型一致的话返回值是和参数的类型一致的
装饰器的思路:
利用可变未知参数和可变关键字参数收集参数
将收集的参数放进字典里:
sig = inspect.signature(add)
params = sig.parameters # OrderedDict
判断字典中的元素
利用收集到的字典中的V值来判断,当然是在函数运行之前判断参数是否符合标准
1.对的话 if xxxx:
就过去,不报任何异常
2.错的话 else:
raise Exception # 抛异常
或者是 raise TypeError #类型错误

functools模块使用

print(reduce(lambda x,y: x + y, range(5), 10)) # 等同于下面的sum函数
print(sum(range(5), 10))
#1到6的阶乘
print(reduce(lambda x,y: x * y, range(1,6)))

partial

def add(x,y):
    return x + y

print(partial(add,4)(5))

9#输出

查看partial的函数签名,得到的是(y)

import inspect
def add(x,y):
    return x + y

print(partial(add,4)(5))
print(inspect.signature(partial(add,4)))

9
(y)

对于有的partial是看不出来新的函数的传参变成什么样,就需要查看一下

def add(x,y,*args,**kwargs):
    return x + y + z
newfunc = partial(add, 1,2,3,z=100)
print(newfunc.func,newfunc.args,newfunc.keywords)

<function add at 0x00000000054B5620> (1, 2, 3) {'z': 100}

#lru_cache()
##lru_cache()

import functools
import time

@functools.lru_cache()
def add(x, y, z=2):
    time.sleep(z)
    return x + y
add(4, 5)

第一次运行add(4, 5)时,会花费2s的时间。等到第二次运行add(4, 5)时,就不会再运行2s的时间。
利用内存记录曾经运行过的数据

import functools

@functools.lru_cache(maxsize=60)
def fib(n):
    return 1 if n < 3 else fib(n-1) + fib(n-2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值