gpt4 book ai didi

Python:类型检查装饰器

转载 作者:行者123 更新时间:2023-11-28 19:13:26 26 4
gpt4 key购买 nike

我构建了一个类型检查装饰器(带包装):

def accepts_func(*types):
"""
top-level decoration, consumes parameters
"""

def decorator(func):
"""
actual decorator function, consumes the input function
"""

@wraps(func)
def check_accepts(*args):
"""
actual wrapper which does some magic type-checking
"""

# check if length of args matches length of specified types
assert len(args) == len(types), "{} arguments were passed to func '{}', but only {} " \
"types were passed to decorator '@accepts_func'" \
.format(len(args), func.__name__, len(types))

# check types of arguments
for i, arg, typecheck in izip(range(1, len(args)+1), args, types):
assert isinstance(arg, typecheck), "type checking: argument #{} was expected to be '{}' but is '{}'" \
.format(i, typecheck, type(arg))

return func(*args)

return check_accepts

return decorator

您可以传递任意数量的类型,它会检查传递给 func 的参数类型是否与 @accepts_func(param_type1, param_type2, ...):

@accepts_func(int, str)
sample_func(arg1, arg2):
...does something...

到目前为止,它没有任何问题。


但是,由于我不是 Python“大师”,我想知道我的解决方案是否适合“更大”的项目?

我的解决方案有什么缺点吗?例如。比如性能问题、边缘情况下 Uncaught Error 等等?

有没有办法改进我的解决方案?是否存在更好、更“pythonic”的解决方案?

注意:我不会对我项目中的每个函数进行类型检查,只是检查那些我认为我确实需要类型安全的函数。该项目在服务器上运行,因此抛出的错误会出现在日志中,用户看不到。

最佳答案

我实际上不鼓励对输入变量进行类型检查。除了性能,Python 是一种动态类型的语言,在某些情况下(例如测试),您需要传递一个对象,该对象实现了您最初计划访问的对象的某些属性,并且可以与您的代码一起正常工作。

一个简单的例子:

class fake_str:
def __init__(self, string):
self.string = string

def __str__(self):
return self.string

string = fake_str('test')

isinstance(string, str) # False
string # 'test'

为什么您不接受有效的东西?

只允许兼容的对象与您的代码一起工作。

Easier to ask for forgiveness than permission !

关于Python:类型检查装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879932/

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