zoukankan      html  css  js  c++  java
  • python开发_function annotations

    在看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': <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
  • 相关阅读:
    python 矩阵转置
    go
    Go-GRPC 初体验
    SpringMVC笔记——Spring+MyBatis组合开发简单实例
    MyBatis笔记——EhCache二级缓存
    MyBatis笔记——Mapper动态代理
    MyBatis笔记——初次环境配置
    Spring笔记——配置Hibernate框架事务
    Hibernate笔记——关联关系配置(一对多、一对一和多对多)
    Mysql笔记——触发器简单实例
  • 原文地址:https://www.cnblogs.com/hongten/p/hongten_python_function_annotation.html
Copyright © 2011-2022 走看看