专栏首页Hongtenpython开发_function annotations

python开发_function annotations

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

原文:

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': <class 'int'>, '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 win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Annotations: {'eggs': <class 'int'>, '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 win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Annotations: {'eggs': <class 'int'>, '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 win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Annotations: {'eggs': <class 'int'>, 'return': 'Nothing to see here', 'ham': '这里是ham的注释'}
Arguments: Hongten spam
>>> 
//THREE :  这里把int变为str
1 #这里把int变为str
2 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 win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Annotations: {'eggs': <class 'str'>, '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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python开发_mysqldb安装

    在python的API上面,看到了MySQLdb,即python可以操作mysql数据库

    Hongten
  • python开发_stat

    当我们使用os.stat(path)获取一个文件(夹)信息的时候, os.stat(path)本身返回的是一个元组如: nt.stat_result(s...

    Hongten
  • J2SE 接口 [interface]

    /**  * 接口  *  接口 [interface]是抽象方法和常量值的定义的集合  *    *  从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含...

    Hongten
  • 应用被强杀了怎么办

    用户1130025
  • 百度Java架构师分享分布式锁的技术选型及思考锁和分布式锁总结

    美的让人心动
  • win10 UWP 九幽数据分析

    在App.xaml.cs添加Suspending和Resuming准备给九幽发信息,这时莫老板就会收到消息

    林德熙
  • 你必须知道的 SmartSql !

    SmartSql 借鉴了 MyBatis 的思想,使用 XML 来管理 SQL ,并且提供了若干个筛选器标签来消除代码层面的各种 if/else 的判断分支。

    Ahoo Wang
  • 营销 | 不止是啤酒与尿布,Taste Analytics用大数据带电商玩转口碑营销

    <数据猿导读> 随着产业升级,越来越多消费者选择电商而非实体超市购买商品,大数据的应用也不再局限于商家手里掌握的销售数据,而是转向如今网络时代更为关心的用户参与...

    数据猿
  • iOS开发工具篇-AppStore统计工具 (转载)

    随着iOS开发的流行,针对iOS开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具。这些解决方案或工具包括:用户行为统计工具(友盟,Flurry,Goo...

    tandaxia
  • thinkPHP框架通过Redis实现增删改查操作的方法详解

    本文实例讲述了thinkPHP框架通过Redis实现增删改查操作的方法。分享给大家供大家参考,具体如下:

    砸漏

扫码关注云+社区

领取腾讯云代金券