在Python中,我想检查传递给函数的参数的类型。
我写了两个实现:
class FooFloat(float):
pass
# Solution 1
def foo(foo_instance):
if type(foo_instance) is FooFloat:
raise TypeError, 'foo only accept FooFloat input'
# Solution 2
def foo(foo_instance):
assert type(foo_instance) is FooFloat, 'foo only accept FooFloat input'
在我看来,后者更容易阅读并且更少的样板代码。但是,它会抛出一个 AssertionError
,这不是我想引发的错误类型。
在这种更常见的情况下,是否有更好的第三种解决方案?
我正在考虑装饰器:
@argtype('foo_instance', FooFloat)
def foo(foo_instance):
pass
最佳答案
我喜欢这个想法并考虑在将来使用它。我实现的第三种解决方案如下,请尝试一下。
def argtype(arg_name, arg_type):
def wrap_func(func):
def wrap_args(*args, **kwargs):
if not isinstance(kwargs.get(arg_name), arg_type):
raise TypeError, '%s\'s argument %s should be %s type' % (func.__name__, arg_name, arg_type.__name__)
return func(*args, **kwargs)
return wrap_args
return wrap_func
@argtype('bar', int)
@argtype('foo', int)
def work(foo, bar):
print 'hello word'
work(foo='a', bar=1)
另外,我认为如果有继承的话,使用isinstance更合适。
关于python - 检查 Python 中函数/方法中参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34061492/