支持 Python 3.8 – PyCharm 2019.2
Python 3.8 的发布为编程领域带来新功能。该语言不断解决需要新语法或逻辑的案例,从而根据其社区的需要而演进。从分配表达式的新方法到限制使用函数声明、调用和变量赋值,此最新版本提供了新的代码选项。当然,PyCharm 不会落后,所以我们现在支持此新版本的一些主要功能。
本文将向您介绍我们最新版 PyCharm 当前支持的功能。如果要试试,请获得最新版 PyCharm,并且从这里下载当前的 beta 版 Python 3.8。您只需将 Python 3.8 切换为您在 PyCharm 中的解释器(如果不确定如何切换解释器,请参阅我们的文档)。
仅限位置的参数
在为用户使用设计库和 API 时,函数定义是一个关键元素。这些定义越明确就越容易实现。实现这种明确性的一种方法是如何使用其参数调用函数。到目前为止,Python 只有将参数定义为位置 (positional)、关键字 (keyword) 或 仅关键字 (keyword-only) 几种选项,但在这个新版本中,我们现在可以使用另一种方法,通过使用仅限位置 (positional-only) 的参数来定义它们。
要使用此功能,只需在函数定义中设置参数,并且在希望声明的最后一个仅限位置的参数后面写个正斜杠 / 。这与仅关键字参数语法非常相似,但却是在斜杠 / 前设置参数,而不是在星号 * 后面。
我们看一个示例。比如您的库中有一个函数,它从作为参数传递的不同值中随机选择一个值。这类值可以在任何位置传递,而且函数将返回一个随机选择。
无论函数调用中值的顺序如何,语义都保持不变。根据设计,您可以确定这些参数应该仅限位置:
这样可以确保库的用户无法使用参数的关键字来调用您的函数。过去,如果为重构目的而重命名函数的参数(或其他原因),如果库的用户要使用关键字参数调用函数,那么他们的代码将面临风险(例如:select_random(a=3, b=89, c=54)
)。
仅限位置的参数的一个优势在于,如果您决定改变函数定义中的变量名称,库的用户不会受到影响,因为在他们的函数调用中没有关键字依赖项。
赋值表达式
最新版 Python 提供为变量赋值的新方法。现在,表达式还可以将值指定为其声明的一部分,这样就无需提前初始化变量。因此,您可以使代码更简洁、紧凑,因为可以在表达式中的同一行声明。
声明变量的语法由表达式中括号括起来的海象运算符 := 组成。一个重要的注意事项是海象运算符与等号运算符不同。
例如,使用等于运算符的逗号分隔赋值与海象运算符所做的赋值不同。这种用法的一个示例可以是带控制变量的 while 循环。使用此功能时,循环的控制表达式还将保留变量定义并且重新赋值。
在前面的示例中,’before’ while 循环之前有一个变量赋值,在其执行代码中也有。‘after’ 循环通过使用赋值表达式在其控制语句定义中赋值。
Final 注释和 final 装饰器
设计类时,必须确保正确地使用方法。在这个新版本中,引入了一个 final 装饰器和 Final
类型注释,帮助限制使用方法、类和变量。如果需要,此功能将允许您声明不应该重写的方法,不应该子类化的类,或者不应该重新赋值的变量或属性。
final 装饰器以 @final 讓任何类禁止子类化,以 @final 装饰任何方法,从而禁止在子类中重写。假设您有一个类,其中声明了方法,并且该方法正在类中的不同地方使用。如果用户在子类中重写该方法,则存在基类行为变化或运行出错的风险。为避免这种情况,您可以使用 final 装饰器来防止用户覆盖此类。
假设您有一个如下所示的签名生成器类:
初始化时,将通过 create_signature
方法生成签名,而且在构造函数 __init__
中调用了该方法。取决于类的设计,您可能选择通过 final 装饰器来保护 create_signature
方法,避免它被子类重写。通过使用 final 装饰器,您可以确保此类中任何依赖此方法的方法不被方法重写所影响。在这个示例中,__init__
构造函数使用 create_signature
方法。通过使用 final 装饰器,您可以确保子类中的任何变化都不会影响到类的初始化。
另一件需要注意的是,在这个例子中,我们使用 Final
属性和 ENCODER
属性。此类属性包含在 create_signature
方法中使用的字符串编码类型。在设计类时,我们选择使用 Final
属性,因为我们在类的方法中使用该值,并且我们不希望重写它,因为这会改变方法的行为。
在 f 字符串中的等号
字符串格式化使代码更简洁、可读,并且在暴露值时不易出错。现在,通过在 f 字符串中引入等号,变量名和值可以在字符串上下文中共存。
为了利用这一新功能,敲入如下 f 字符串:f'{expr=}'
,其中 expr
是您希望暴露出来的变量。这样,您生成一个字符串,显示表达式和输出。
将变量值写入日志时,此功能非常有用。如果您碰巧将其用于调试,您也许想试试 PyCharm 的调试器。
了解更多内容
有关这些功能的用法和示例的详细信息,请参阅 PEP-0570、PEP-0572、PEP-0591 和 bpo-36817。
我们 PyCharm 团队继续致力于全面支持 Python 3.8,我们希望这些功能在设置或使用 Python 3.8 项目时能够派上用场。预计在不久的将来会支持其他功能,敬请密切关注我们的最新版本。
如果您有任何问题或建议,请留下意见。
谢谢!
原文发表于2019年8月21日,作者Joaquin Treviño