Python 3 的函数 Annotations 还可以这样用

2017-03-25 19:19:31 +08:00
 guyskk

Python 3.5 开始支持 Annotations ,可以用来给函数参数加上注解,也有一个叫 mypy 的库用它来做静态类型检查。

前几天发布 Validr 0.14.0 版,在 reddit 上也有人问支不支持 mypy ,今天突发奇想写了个用来运行时检查参数和返回值。

一个简单的实现:

# python >= 3.5
# pip install validr
from validr import SchemaParser, mark_key


def validation(f):
    """Decorator for validate function params and return by __annotations__"""
    parser = SchemaParser()
    return_ = None
    params = {}
    for k, v in f.__annotations__.items():
        if k == 'return':
            return_ = parser.parse(v)
        else:
            params[k] = parser.parse(v)

    def wrapper(**kwargs):
        for k, v in params.items():
            with mark_key(k):
                kwargs[k] = v(kwargs.get(k, None))
        result = f(**kwargs)
        if return_:
            with mark_key('return'):
                result = return_(result)
        return result
    return wrapper


@validation
def login(
    username: 'str',
    password: 'str&minlen=6',
) -> {
    'id?int': 'User ID',
}:
    return {'id': 1000000}


if __name__ == '__main__':
    print(login(username='guyskk', password='123456'))
    print(login(username='guyskk', password='1234'))

另外这种写法也是能实现的:

@validation
def login(
    username: StringType(),
    password: StringType(minlen=6),
) -> {
    'id': IntType(desc='User ID'),
}:
    return {'id': 1000000}

大家觉得这两个写法怎么样,有需要这样一个库的吗

1879 次点击
所在节点    Python
1 条回复
guyskk
2017-03-25 20:25:50 +08:00
打算放弃这种写法 -> 还不如直接写 go 算了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350274

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX