Python■你应该知道的Python3.6、3.7、3.8新特性( 六 )

 用来指明某些函数形参必须使用仅限位置而非关键字参数的形式 。
这种标记语法与通过 help () 所显示的使用 Larry Hastings 的 Argument Clinic 工具标记的 C 函数相同 。
在下面的例子中 , 形参 a 和 b 为仅限位置形参 , c 或 d 可以是位置形参或关键字形参 , 而 e 或 f 要求为关键字形参:
def f(a b / c d * e f):\t

   print(a b c d e f)

以下是合法的调用:
f(10 20 30 d=40 e=50 f=60)

但是 , 以下均为不合法的调用:
f(10 b=20 c=30 d=40 e=50 f=60)   # b 不可以是一个关键字参数f(10 20 30 40 50 f=60)           # e 必须是一个关键字参数

这种标记形式的一个用例是它允许纯 Python 函数完整模拟现有的用 C 代码编写的函数的行为 。 例如 , 内置的 pow () 函数不接受关键字参数:
def pow(x y z=None /):\t

   \"Emulate the built in pow() function\"\t

   r = x ** y\t

   return r if z is None else r%z

另一个用例是在不需要形参名称时排除关键字参数 。 例如 , 内置的 len () 函数的签名为 len (obj /) 。 这可以排除如下这种笨拙的调用形式:
len(obj='hello')  # The \"obj\" keyword argument impairs readability

另一个益处是将形参标记为仅限位置形参将允许在未来修改形参名而不会破坏客户的代码 。 例如 , 在 statistics 模块中 , 形参名 dist 在未来可能被修改 。 这使得以下函数描述成为可能:
def quantiles(dist / * n=4 method='exclusive')\t
   ...

由于在 / 左侧的形参不会被公开为可用关键字 , 其他形参名仍可在 **kwargs 中使用:
>>> def f(a b / **kwargs):\t...     print(a b kwargs)\t
...\t
>>> f(10 20 a=1 b=2 c=3)         # a and b are used in two ways\t10 20 {'a': 1 'b': 2 'c': 3

这极大地简化了需要接受任意关键字参数的函数和方法的实现 。 例如 , 下面是 collections 模块中的代码摘录:
class Counter(dict):\t

   def __init__(self iterable=None / **kwds):\t

       # Note \"iterable\" is a possible keyword argument

3、f 字符串支持 =增加 = 说明符用于 f-string 。 形式为 f'{expr=' 的 f 字符串将扩展表示为表达式文本 , 加一个等于号 , 再加表达式的求值结果 。 例如:
>>> user = 'eric_idle'\t>>> member_since = date(1975 7 31)\t
>>> f'{user= {member_since='\t\"user='eric_idle' member_since=datetime.date(1975 7 31)\"

f 字符串格式说明符允许更细致地控制所要显示的表达式结果:
>>> delta = date.today() - member_since\t

>>> f'{user=!s  {delta.days=:d'\t'user=eric_idle  delta.days=16075'

= 说明符将输出整个表达式 , 以便详细演示计算过程:
>>> print(f'{theta=  {cos(radians(theta))=:.3f')\t
theta=30  cos(radians(theta))=0.866

4、 typing模块的改进Python是动态类型语言 , 但可以通过typing模块添加类型提示 , 以便第三方工具验证Python代码 。 Python 3.8给typing添加了一些新元素 , 因此它能够支持更健壮的检查: