博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python开发_function annotations
阅读量:6258 次
发布时间:2019-06-22

本文共 4897 字,大约阅读时间需要 16 分钟。

在看python的API的时候,发现了一个有趣的东东,即:python的方法(函数)注解(Function Annotation)

原文:

4.7.7. Function Annotations

Function annotations are completely optional, arbitrary metadata information about user-defined functions. Neither Python itself nor the standard library use function annotations in any way; this section just shows the syntax. Third-party projects are free to use function annotations for documentation, type checking, and other uses.Annotations are stored in the __annotations__ attribute of the function as a dictionary and have no effect on any other part of the function. Parameter annotations are defined by a colon after the parameter name, followed by an expression evaluating to the value of the annotation. Return annotations are defined by a literal ->, followed by an expression, between the parameter list and the colon denoting the end of the def statement. The following example has a positional argument, a keyword argument, and the return value annotated with nonsense:>>> def f(ham: 42, eggs: int = 'spam') -> "Nothing to see here":...     print("Annotations:", f.__annotations__)...     print("Arguments:", ham, eggs)...>>> f('wonderful')Annotations: {
'eggs':
, 'return': 'Nothing to see here', 'ham': 42}Arguments: wonderful spam

初略的看了一下,没有理解其参数的涵义,就照着写了一遍程序:

1 def f(ham: 42, eggs: int = 'spam') -> 'Nothing to see here':2     print('Annotations:', f.__annotations__)3     print('Arguments:', ham, eggs)4 5 f('wonderful')

运行效果:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> Annotations: {
'eggs':
, 'ham': 42, 'return': 'Nothing to see here'}Arguments: wonderful spam>>>

运行效果和python的API中描述的一样。

搜索了一些资料发现了参数的涵义:

我们先来看看几个demo:

ONE : 这里给ham赋一个初始值'Hongten'
1 #这里给ham赋一个初始值'Hongten'2 def f(ham: 42 = 'Hongten', eggs: int = 'spam') -> 'Nothing to see here':3     print('Annotations:', f.__annotations__)4     print('Arguments:', ham, eggs)5 6 f()

运行效果:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> Annotations: {
'eggs':
, 'ham': 42, 'return': 'Nothing to see here'}Arguments: Hongten spam>>>
//TWO :  这里把42变为:'这里是ham的注释'
1 #这里把42变为:'这里是ham的注释'2 def f(ham: '这里是ham的注释' = 'Hongten', eggs: int = 'spam') -> 'Nothing to see here':3     print('Annotations:', f.__annotations__)4     print('Arguments:', ham, eggs)5 6 f()

运行效果:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> Annotations: {
'eggs':
, 'return': 'Nothing to see here', 'ham': '这里是ham的注释'}Arguments: Hongten spam>>>
//THREE :  这里把int变为str
1 #这里把int变为str2 def f(ham: '这里是ham的注释' = 'Hongten', eggs: str = 'spam') -> 'Nothing to see here':3     print('Annotations:', f.__annotations__)4     print('Arguments:', ham, eggs)5 6 f()

运行效果:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> Annotations: {
'eggs':
, 'ham': '这里是ham的注释', 'return': 'Nothing to see here'}Arguments: Hongten spam>>>
//FOUR :  看看一段java函数代码
/**     * 判断一个字符串是否全为字母,此方法比上面的isAllChar方法效率要高,但是需要的是str中包含非字母字符在靠前面     * 如:"a2bcd",对于这个字符串,到字符"2"的时候就会终止判断     *      * @param str     *            所需判断的字符串     * @return str中是否全为字母字符     */    public static boolean isAllChars(String str) {        if (str == null || str.equals("")) {            return false;        }        boolean flag = true;        for (int i = 0; i < str.length(); i++) {            if ((str.charAt(i) < 'a' || str.charAt(i) > 'z')                    && (str.charAt(i) < 'A' || str.charAt(i) > 'Z')) {                flag = false;                break;            }        }        return flag;    }

到这里你大概知道我想说什么了吧!

总结:

def f(ham: 42, eggs: int = 'spam') -> "Nothing to see here":    print("Annotations:", f.__annotations__)    print("Arguments:", ham, eggs)#def关键字定义了函数f,在函数f中有两个参数:ham,eggs。#其中ham没有默认值,而eggs是由默认值的,其默认值为'spam'.#参数ham的注释部分为:42;参数eggs的注释部分为:int# "Nothing to see here"是返回值的注释,这个必须用 '->'连接#看了java代码后,你会有更直观的认识,注释嘛,你可以根据你自己的想法,想怎么写就怎么写,如42,int;不过不好的注释有时候会给别人阅读代码带来很大的麻烦#如果上面的代码是这样写:def f(ham: int = 42, eggs: str = 'spam') -> 'Nothing to see here':    print("Annotations:", f.__annotations__)    print("Arguments:", ham, eggs) #我想很多人阅读代码的时候就很容易理解啦 #上面只是个人观点,如果不正确的地方,还请大家指正 #同时也希望大家相互学习:hongtenzone@foxmail.com

转载地址:http://ruxsa.baihongyu.com/

你可能感兴趣的文章
之字形打印矩阵
查看>>
我的世界之电脑mod小乌龟 —— 方位上的操作 lua函数集
查看>>
游戏方案
查看>>
在 Linux 下搭建 Git 服务器
查看>>
StackExchange.Redis Client(转载)
查看>>
Leetcode题目:Bulls and Cows
查看>>
bk. 2014.12.1
查看>>
CEOI2014 wall Spoiler
查看>>
UVA10391 ZOJ1825 Compound Words【SET+暴力】
查看>>
动态规划------Combination Sum IV
查看>>
[BZOJ2463][中山市选2009]谁能赢呢?
查看>>
iOS数据持久化存储之属性列表
查看>>
最后冲刺时间
查看>>
前端开发薪资之各地区对比(图文分析)
查看>>
jquery简单的大背景banner图片全屏切换
查看>>
java疑问
查看>>
JAVAEE 介绍
查看>>
视图和路由
查看>>
优酷新版播放器站外调用代码详解
查看>>
Python之操作符优先级
查看>>