如何在函数定义中强制执行自动参数转换?

bit*_*ask 4 python types type-conversion

考虑一个函数(及其使用)的示例,该函数接收一个仅在int以下情况下有意义的参数:

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

def main():
    print fun(1e6)
Run Code Online (Sandbox Code Playgroud)

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

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

例如,这个伪代码的内容:

def fun(int index):
    # do something with index
Run Code Online (Sandbox Code Playgroud)

Isa*_*aac 6

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

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
Run Code Online (Sandbox Code Playgroud)

像:

> test("2") 
ERROR!!!

>test2("2")
4
Run Code Online (Sandbox Code Playgroud)

  • +1"Python不是静态类型的".如果你不知道你传递给函数的是什么,那么回报是什么呢? (2认同)

Bre*_*arn 2

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

在 Python 2 中,您无法按照您想要的方式执行此操作。Python 2 的语法不支持在函数定义中添加除参数本身之外的任何内容,并且您无法更改 Python 的语法以允许您在其中添加类型。