gpt4 book ai didi

python-3.x - 使用 Python 3 函数注解的开源项目示例

转载 作者:行者123 更新时间:2023-12-04 13:12:18 25 4
gpt4 key购买 nike

谁能给我一些使用 Python 3 中引入的函数注释的 Python 开源项目示例?

我想看看这个功能的一些实际用途,看看我是否可以在我自己的项目中使用它。

最佳答案

我从未见过在野外使用此功能。但是,我在为 USENIX ;Login: 写的一篇关于 Python 3 的文章中探讨了函数注释的一个潜在用途。是为了执行契约(Contract)。例如,你可以这样做:

from functools import wraps

def positive(x):
'must be positive'
return x > 0

def negative(x):
'must be negative'
return x < 0

def ensure(func):
'Decorator that enforces contracts on function arguments (if present)'
return_check = func.__annotations__.get('return',None)
arg_checks = [(name,func.__annotations__.get(name))
for name in func.__code__.co_varnames]

@wraps(func)
def assert_call(*args):
for (name,check),value in zip(arg_checks,args):
if check:
assert check(value),"%s %s" % (name, check.__doc__)
result = func(*args)
if return_check:
assert return_check(result),"return %s" % (return_check.__doc__)
return result
return assert_call

# Example use
@ensure
def foo(a:positive, b:negative) -> positive:
return a-b

如果你这样做,你会看到这样的行为:
>>> foo(2,-3)
5
>>> foo(2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ensure.py", line 22, in assert_call
assert check(value),"%s %s" % (name, check.__doc__)
AssertionError: b must be negative

我应该注意到,需要更多地充实上面的示例,才能正常使用默认参数、关键字参数和其他细节。这只是一个想法的草图。

现在,这是否是一个好主意,我只是不知道。我倾向于同意 Brandon 的观点,即缺乏可组合性是一个问题——尤其是当不同的库开始出于不同目的使用注释时。我也想知道这样的契约想法是否不能通过装饰器来完成。例如,制作一个像这样使用的装饰器(实现留作练习):
@ensure(a=positive,b=negative)
def foo(a,b):
return a-b

历史笔记,我一直觉得函数注释是 Python 社区 10 多年前关于“可选静态类型”的讨论的产物。这是否是最初的动机,我只是不知道。

关于python-3.x - 使用 Python 3 函数注解的开源项目示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5299874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com