gpt4 book ai didi

python - 检查Python中函数的参数

转载 作者:太空狗 更新时间:2023-10-30 01:48:37 25 4
gpt4 key购买 nike

例如,我有一个生成程序噪声的函数

def procedural_noise(width, height, seed):
...

这个函数的所有参数都应该是正数。我想,我需要检查它并在其中一个参数为非正数时抛出异常。这是一种好的(pythonic 方式)方法吗?

让我们假设,我是对的。检查参数的最佳方法是什么?


我可以为每个参数编写检查器:

def procedural_noise(width, height, seed):
if width <= 0:
raise ValueError("Width should be positive")
if height <= 0:
raise ValueError("Height should be positive")
if seed <= 0:
raise ValueError("Seed should be positive")
...

程序员应该清楚什么时候会得到异常,他应该纠正什么,但我认为这不太好看。

下面的代码比较简单,但是离理想还差得太远:

def procedural_noise(width, height, seed):
if width <= 0 or height <= 0 or seed <= 0:
raise ValueError("All of the parameters should be positive")
...

最后一个问题:使用 unittest 框架编写检查参数类型及其值的测试的最佳方式是什么?

我可以在测试类中编写以下函数:

def test_positive(self):
self.assertRaises(ValueError, main.procedural_noise, -10, -10, 187)

这是一个正确的解决方案吗?


UPD:我对所有答案都投了赞成票,因为它们每个都有对我有用的信息,但我无法从中选择最佳答案(我想明天选择投票最多的问题是公平的)

最佳答案

此外,这可能是函数注释的一个很好的用例(在 Python 3 中)。示例:

import inspect
from functools import wraps

def positive(name, value):
if value < 0:
raise ValueError(name + " must be positive")

def check_params(f):
signature = inspect.signature(f)
@wraps(f)
def wrapper(*args, **kwargs):
bound_arguments = signature.bind(*args, **kwargs)
for name, value in bound_arguments.arguments.items():
annotation = signature.parameters[name].annotation
if annotation is inspect.Signature.empty:
continue
annotation(name, value)
return f(*args, **kwargs)
return wrapper

@check_params
def procedural_noise(width: positive, height: positive, seed: positive):
pass # ...

它在 check_params 装饰器(受 github.com/ceronman/typeannotations 启发)中有点 inspect-fu,但提供了非常漂亮和灵活的方法来检查函数参数 - 没有任何 ifs、fors 或类型检查函数中的其他噪声代码。

关于python - 检查Python中函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29583588/

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