===
##译者的话 最近修改的 PEP 0484 表明 py3 中将增加对 Type Hints 的支持,
相关的理论介绍在 PEP 0483。
PEP 0484还在 Accepted PEPs (accepted; may not be implemented yet) 列表中,但是 PEP 3107 已经在 py3 中实现。
翻译格式参考PEP333-zh-CN
##内容
- 摘要
- [函数注解的基础](#Fundamentals of Function Annotations)
- 语法
- 参数
- [返回值](#Return Values)
- 匿名函数(lambda)
- [访问函数注解](#Accessing Function Annotations)
Python 自身不会给注解本身加上具体的意思或者某种信号。也就是说,Python 仅仅让这些表达式可以按照下面描述的 访问函数注解( Accessing Function Annotations ) 的方式去访问。
只有当第三方库去解释函数注解时,这些表达式才有意义。三方库可以对这些注解做任何想做的事情。举例来说,一个库也许会使用字符类型(string-based)的函数注解来提供更有效的帮助信息。如:
def compile(source: something compilable,
filename: where the compilable thing comes from,
mode: is this a single statement or a suite?):
...
一个其他的库或许会被用来为 Python 的函数(function)和方法(method)提供类型检查。这个库可以使用函数注解来指明参数类型和函数返回值。可能的例子如下:
def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
...
然而,无论是第一个例子中的字符类型还是第二个例子中的类型信息(type information),它们独自存在的时候没有任何意义,只有当第三方的库使用他们时,他们才有具体的意义
- 根据观点二,即使是对内置类型(build-in type),这个 PEP 也并不尝试引进任何种类的标准语义。这项工作将留给第三方库来完成。
def foo(a: expression, b: expression = 5):
...
在这种伪语法(pseudo)中参数现在以 identifier [: expression] [= expression] 的形式出现。所以参数注解永远先于参数的默认值,注解和默认值都是可选项。就像用等好来标志默认值,参数注解使用冒号来表明。和参数默认值一样,所有的注解表达式都会在函数定义执行时被求值(evaluated)。
同理,可变参数(excess parameters)的参数注解也用类似的方法指明。
def foo(*args: expression, **kwargs: expression):
...
嵌套参数的注解同样是参数名字后跟注解的形式,并不是跟随在最后的括号之后。没有必要为所有的嵌套参数加上注解。
def foo((x1, y1: expression),
(x2: expression, y2: expression)=(None, None)):
...
def sum() -> expression:
...
参数序列后跟随一个 -> 符号,后面跟随 Python 表达式。和对参数的注解一样,这个注解将在函数定义执行时被求值。
函数的语法定义现在变成了:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'
typedargslist: ((tfpdef ['=' test] ',')*
('*' [tname] (',' tname ['=' test])* [',' '**' tname]
| '**' tname)
| tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
tname: NAME [':' test]
tfpdef: tname | '(' tfplist ')'
tfplist: tfpdef (',' tfpdef)* [',']
- 它将是一个不兼容的更改。
- Lambda's are neutered anyway.(这句不知道怎么翻译好 个人认为,可以理解为Lambda不是一个完整的函数)
- lambda表达式可以转换成函数。
func_annotations
键值对中有一个特别的键,"retrun"
。这个键只有提供了函数返回值的注解时才有。
例如,有如下的注解:
def foo(a: \'x\', b: 5 + 6, c: list) -> max(2, 9):
...
返回结果func_annotations的键值对为:
{'a': 'x',
'b': 11,
'c': list,
'return': 9}
选择"return"
键因为它不会和参数名冲突,尝试使用"return"
作为参数名会导致语法错误。
如果该函数没有任何函数注解,或者该函数为一个lambda
表达式,func_annotations
将为空。
##译者注 翻译出于兴趣和学习目的,水平十分有限,翻译不好或有误之处请指正 : )