Python函数定义中的 "->" 表示函数返回的类型。例如,以下函数返回类型为整数:```pythondef add(x: int, y: int) -> int: return x + y```

14 浏览
0 Comments

Python函数定义中的 "->" 表示函数返回的类型。例如,以下函数返回类型为整数:```pythondef add(x: int, y: int) -> int: return x + y```

最近我在查看Python 3.3语法规范时发现了一件有趣的事情:

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

在Python 2中,可选的\"箭头\"块是不存在的,我找不到关于它在Python 3中的含义的任何信息。结果证明这是正确的Python语法,并被解释器接受:

def f(x) -> 123:
    return x

我想这可能是某种前置条件语法,但是:

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

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

这些是在PEP 3107中涵盖的函数注释。具体来说,->标记返回函数注释。

例如:

def kinetic_energy(m:'in KG', v:'in M/S')->'Joules': 
    return 1/2*m*v**2
>>> kinetic_energy.__annotations__
{'return': 'Joules', 'v': 'in M/S', 'm': 'in KG'}

注释是字典,因此你可以这样做:

>>> '{:,} {}'.format(kinetic_energy(12,30),
      kinetic_energy.__annotations__['return'])
'5,400.0 Joules'

你也可以使用Python数据结构而不仅仅是字符串:

rd={'type':float,'units':'Joules',
    'docstring':'Given mass and velocity returns kinetic energy in Joules'}
def f()->rd:
    pass
>>> f.__annotations__['return']['type']

>>> f.__annotations__['return']['units']
'Joules'
>>> f.__annotations__['return']['docstring']
'Given mass and velocity returns kinetic energy in Joules'

或者,你可以使用函数属性来验证调用的值:

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        try: 
            pr=test.__name__+': '+test.__docstring__
        except AttributeError:
            pr=test.__name__   
        msg = '{}=={}; Test: {}'.format(var, value, pr)
        assert test(value), msg
def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    _between.__docstring__='must be between {} and {}'.format(lo,hi)       
    return _between
def f(x: between(3,10), y:lambda _y: isinstance(_y,int)):
    validate(f, locals())
    print(x,y)

输出:

>>> f(2,2) 
AssertionError: x==2; Test: _between: must be between 3 and 10
>>> f(3,2.1)
AssertionError: y==2.1; Test: 

0
0 Comments

这是一个 函数注解

更详细地说,Python 2.x 有文档字符串,允许你将元数据字符串附加到各种类型的对象上。这非常方便,所以 Python 3 扩展了这个功能,允许你为函数附加描述它们参数和返回值的元数据。

没有预设的用例,但 PEP 提出了几个。一个非常方便的用例是允许你注释参数的预期类型;然后很容易编写一个装饰器来验证注释或将参数强制转换为正确的类型。另一个用例是允许参数特定的文档,而不是将它编码到文档字符串中。

0