4

考虑这个函数(及其使用)的例子,它接收一个仅有意义的参数int

def fun(index):
    index = int(index)
    # do something with index

def main():
    print fun(1e6)

我发现我在几个处理整数的函数上不断重复这种模式,因为它确保我真的收到了一些整数(注意这1e6是一个浮点实例)。

这有点麻烦,如果一旦忘记它可能会产生问题(有些代码对浮点/整数/字符串/...值的反应不同)。那么这可以以某种方式编码在函数签名中吗?

例如,类似于此伪代码的内容:

def fun(int index):
    # do something with index
4

2 回答 2

7

首先,你不应该真的这样做(即使有些日子我也想这样做......)。Python 不是静态类型的,所以你不应该真正引入杂乱无章的静态类型。

Buuut,回答你的问题。装饰器

def ensure_int(fn):
    def wrapper(num):
        return fn(int(num))
    return wrapper

def test(num):
    return num + 2

@ensure_int
def test2(num):
    return num + 2

像这样工作:

> test("2") 
ERROR!!!

>test2("2")
4
于 2013-04-07T03:05:02.290 回答
2

在 Python 3 中,您可以使用函数注释,然后编写一个装饰器,将参数转换(或尝试转换)为您指定的类型。

在 Python 2 中,您无法以您想要的方式执行此操作。Python 2 的语法不支持在函数定义中放入任何东西,除了参数本身,而且你不能改变 Python 的语法来让你把类型也放在那里。

于 2013-04-07T03:28:46.797 回答