gpt4 book ai didi

python - 如何检查函数的参数?

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:20 25 4
gpt4 key购买 nike

我有这样定义的功能:

def f1 (a, b, c = None, d = None):
.....

如何检查 ab 是否不等于某个值。例如。我想检查它们不是空字符串,例如 """"

思考类似的事情。

arguments = locals()
for item in arguments:
check_attribute(item, arguments[item])

然后检查参数是否不是""""。但在这种情况下,它还会尝试检查 None 值(这是我不想做的)。

最佳答案

典型的方法是:

import sys

...

def check_attribute(name, value):
"""Gives warnings on stderr if the value is an empty or whitespace string.

All other values, including None, are OK and give no warning.
"""
if isinstance(value, basestring) and (not value or value.isspace()):
print>>sys.stderr, "Invalid value %r for argument %r" % (value, name)

或者,当然,如果根据应用程序的语义问题非常严重,您可以发出警告或引发异常。

一个人可能应该将所有检查委托(delegate)给一个函数,而不是在你正在检查其参数的函数中循环(后者会在应用程序逻辑中间粘贴“检查代码” - 最好保留它出去或路上......):

def check_arguments(d):
for name, value in d.iteritems():
check_attribute(name, value)

函数就是:

def f1 (a, b, c=None, d=None):
check_arguments(locals())
...

或者,您可以编写装饰器以便能够编码

@checked_arguments
def f1 (a, b, c=None, d=None):
...

(让检查代码甚至更多“不碍事”),但这可能被认为是矫枉过正,除非你确实有很多函数需要这种类型支票!

参数名称自省(introspection)(虽然可行,但要感谢模块 inspect)在装饰器中远不如函数本身简单,这就是为什么我最喜欢的设计方法是在这种情况下避开装饰器方法(简单性非常好;-)。

编辑 -- 显示如何实现装饰器,因为 OP 明确要求一个(尽管没有说明原因)。

主要问题(在 Python 2.6 和更早版本中)是包装器构造一个等效于 locals() 的映射。 Python 为您制作的,但需要在通用包装器中显式完成。

但是 -- 如果您使用新的 2.7,inspect.getcallargs 你做的!因此,问题变得简单得多,在更多情况下装饰器可能值得做(如果您使用的是 2.6 或更早版本,我仍然建议避免使用装饰器方法,对于此类特殊用途,装饰器方法会复杂得多)。

所以,这就是您在 Python 2.7 中所需要的(重复使用我在上面定义的 check_arguments 函数):

import functools
import inspect

def checked_arguments(f):
@functools.wraps(f)
def wrapper(*a, **k):
d = inspect.getcallargs(f, *a, **k)
check_arguments(d)
return f(*a, **k)
return wrapper

pre-2.7 版本的困难完全来自于实现等同于 inspect.getcallargs 的困难。 -- 所以,我希望,如果你真的需要这种装饰器,你可以简单地从 www.python.org 下载 Python 2.7。并将其安装在您的盒子上!-)(如果这样做,您还将获得更多好东西,以及比几乎任何以前的 Python 版本更长的支持周期,因为 2.7 被定为 Python 2.* 行中的最后一个版本)。

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

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