最近在查看Python 3.3语法规范时,我注意到一些有趣的事情:

funcdef: 'def' NAME parameters ['->' test] ':' suite

可选的“箭头”块在Python 2中不存在,我在Python 3中找不到关于它的含义的任何信息。事实证明这是正确的Python,它被解释器接受:

def f(x) -> 123:
    return x

我认为这可能是一种前提语法,但是:

我不能在这里测试x,因为它仍然没有定义, 无论我在箭头后面放什么(例如2 < 1),它都不会影响函数的行为。

熟悉这种语法风格的人能解释一下吗?


当前回答

正如其他答案所述,->符号用作函数注释的一部分。不过,在Python >= 3.5的最新版本中,它有明确的含义。

PEP 3107——函数注释描述了规范,定义了语法的变化,func的存在。__annotations__,它们被存储在其中,事实上,它的用例仍然是开放的。

但在Python 3.5中,PEP 484——类型提示附加了一个含义:->用于指示函数返回的类型。这似乎也将在未来的版本中强制执行,如注释的现有用法所述:

最快的方案是在3.6中无声地弃用非类型提示注释,在3.7中完全弃用,并将类型提示声明为Python 3.8中唯一允许使用的注释。

(强调我的)

据我所知,这在3.6版还没有实现,所以它可能会被推到未来的版本中。

根据这一点,你提供的例子:

def f(x) -> 123:
    return x

未来将被禁止(在当前版本中会令人困惑),它将需要更改为:

def f(x) -> int:
    return x

为了有效地描述该函数,f返回一个int类型的对象。

Python本身并不以任何方式使用注释,它基本上填充并忽略它们。这取决于第三方库与他们一起工作。

其他回答

在以下代码中:

def f(x) -> int:
    return int(x)

-> int只是告诉f()返回一个整数(但它不强制函数返回一个整数)。它被称为返回注释,可以通过f.__annotations__['return']访问。

Python还支持参数注释:

def f(x: float) -> int:
    return int(x)

: float告诉阅读程序(以及一些第三方库/程序,例如pylint)的人x应该是浮点数。它被访问为f.__annotations__['x'],本身没有任何意义。更多信息请参阅文档:

https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/

它只是告诉用户它期望什么或返回什么值

funcname。__annotations__将打印细节

like

def function(name:str ,age:int) -> "printing the personal details ":
    print(f"name is {name} age is {age}")

function("test",20)
print(function.__annotations__)

输出

name is test age is 20
{'name': <class 'str'>, 'age': <class 'int'>, 'return': 'printing the personal details '}

即使您返回值,它也不显示任何内容。

def f(x) -> str:
return x+4

print(f(45))

将给出结果:49。

换句话说,'-> str'对返回类型没有影响:

print(f(45).__class__)

<class 'int'>

->在python3中被引入。

简单地说,->后面的内容表示函数的返回类型。 返回类型是可选的。

正如其他答案所述,->符号用作函数注释的一部分。不过,在Python >= 3.5的最新版本中,它有明确的含义。

PEP 3107——函数注释描述了规范,定义了语法的变化,func的存在。__annotations__,它们被存储在其中,事实上,它的用例仍然是开放的。

但在Python 3.5中,PEP 484——类型提示附加了一个含义:->用于指示函数返回的类型。这似乎也将在未来的版本中强制执行,如注释的现有用法所述:

最快的方案是在3.6中无声地弃用非类型提示注释,在3.7中完全弃用,并将类型提示声明为Python 3.8中唯一允许使用的注释。

(强调我的)

据我所知,这在3.6版还没有实现,所以它可能会被推到未来的版本中。

根据这一点,你提供的例子:

def f(x) -> 123:
    return x

未来将被禁止(在当前版本中会令人困惑),它将需要更改为:

def f(x) -> int:
    return x

为了有效地描述该函数,f返回一个int类型的对象。

Python本身并不以任何方式使用注释,它基本上填充并忽略它们。这取决于第三方库与他们一起工作。