python - 检查 Python 中函数/方法中参数的类型

标签 python exception types arguments

在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/

相关文章:

python - 如何根据 python 中提供的 0 和 1 矩阵生成矩阵组合?

Python - 让父线程处理子线程异常

types - 我如何在 Rust 中惯用地将 bool 转换为 Option 或 Result?

c++ - reinterpret_cast 会导致严格的别名冲突吗?

c# - "object as type"和 "((type)object)"有什么区别?

python - numba 中的函数类型

php - 如何从字符串开头匹配并捕获所有 ORed 正则表达式

python - Django + MongoDB

c# - 类型加载异常

python - 如何提高嵌套 try-except-else 子句中的代码清晰度?