annotation – 标注
-
关联到某个变量、类属性、函数形参或返回值的标签,被约定作为 type hint 来使用。
-
局部变量的标注在运行时不可访问,但全局变量、类属性和函数的标注会分别存放模块、类和函数的 annotations 特殊属性中。
variable annotation – 变量标注
-
对变量或类属性的 annotation。
-
在标注变量或类属性时,还可选择为其赋值:
class C: field: 'annotation'
-
变量标注通常被用作 类型提示:例如以下变量预期接受 int 类型的值:
count: int = 0
带标注的赋值语句
- 标注赋值 在单个语句中将变量或属性标注和可选的赋值语句合为一体
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
与普通 赋值语句 的差别在于仅有单个目标且仅有单个右手边的值才被允许
对于将表达式作为赋值目标的情况,如果是在类或模块作用域中,标注会被求值,但不会保存。
如果一个名称在函数作用域内被标注,则该名称为该作用域的局部变量。 标注绝不会在函数作用域内被求值和保存。
function annotation – 函数标注
- 即针对函数形参或返回值的 annotation
- 函数标注通常用于 类型提示:
- 例如以下函数预期接受两个 int 参数并预期返回一个 int 值
def sum_two_numbers(a: int, b: int) -> int:
return a + b
函数定义
- 函数定义就是对用户自定义函数的定义
funcdef ::= [decorators] “def” funcname “(” [parameter_list] “)”
["->" expression] “:” suite
decorators ::= decorator+
decorator ::= “@” dotted_name ["(" [argument_list [","]] “)”] NEWLINE
dotted_name ::= identifier ("." identifier)*
parameter_list ::= defparameter ("," defparameter)* ["," [parameter_list_starargs]]
| parameter_list_starargs
parameter_list_starargs ::= “" [parameter] ("," defparameter) [”," ["" parameter [","]]]
| "" parameter [","]
parameter ::= identifier [":" expression]
defparameter ::= parameter ["=" expression]
funcname ::= identifier
函数定义是一条可执行语句。 它执行时会在当前局部命名空间中将函数名称绑定到一个函数对象(函数可执行代码的包装器)。 这个函数对象包含对当前全局命名空间的引用,作为函数被调用时所使用的全局命名空间。
函数定义并不会执行函数体;只有当函数被调用时才会执行此操作。
一个函数定义可以被一个或多个 decorator 表达式所包装。 当函数被定义时将在包含该函数定义的作用域中对装饰器表达式求值。 求值结果必须是一个可调用对象,它会以该函数对象作为唯一参数被发起调用。 其返回值将被绑定到函数名称而非函数对象。 多个装饰器会以嵌套方式被应用。