天天看点

Python3.12新特性,不止更新了个“寂寞”

作者: 麦叔编程

来源: 麦叔编程

Python3每次更新版本,都会有小道消息说会取消GIL(全局解释锁),但实际...

Python3.12带来的新特性

改进报错提醒

Python3.12之前模块忘记导入是这样的:

>>> sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
           

新版本会提醒你是否忘记导入模块:

>>> sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?
           

忘记在类中写self也会提醒你:

class A:
   def __init__(self):
       self.blech = 1

   def foo(self):
       somethin = blech
           
>>> A().foo()
Traceback (most recent call last):
  File "<stdin>", line 1
    somethin = blech
               ^^^^^
NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
           

from...import...语句写反也会提醒你:

import a.y.z from b.y.z
Traceback (most recent call last):
  File "<stdin>", line 1
    import a.y.z from b.y.z
    ^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead?
           

导入模块时,稍稍写错了模块名也会提醒你:

from collections import chainmap
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
           

强化f-string语句功能

f"{}"中可以使用表达式了~

>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"This is the playlist: {", ".join(songs)}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
           

f"{}"可以嵌套了~

f"""{f'''{f'{f"{1+1}"}'}'''}"""
'2'
           

多行表达式和注释:

>>> f"This is the playlist: {", ".join([
...     'Take me back to Eden',  # My, my, those eyes like fire
...     'Alkaline',              # Not acid nor alkaline
...     'Ascensionism'           # Take to the broken skies at last
... ])}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
           

反斜杠和unicode字符!!

这个真的很赞!以前要是f-string表达式中出现\字符,这个表达式基本就废了,现在靠反斜杠转下就行了!
print(f"This is the playlist: {"\n".join(songs)}")
This is the playlist: Take me back to Eden
Alkaline
Ascensionism
print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
           

override装饰器

@override在Java中经常被使用,它的用途是当子类的方法想覆盖父类方法的默认实现时。

通过@override装饰器来表示,用来告诉编译器,这是一个被重写的方法,当重写的子方法被调用时,不需再去调父类的方法了。

from typing import override

class Base:
  def get_color(self) -> str:
    return "blue"

class GoodChild(Base):
  @override  # ok: overrides Base.get_color
  def get_color(self) -> str:
    return "yellow"

class BadChild(Base):
  @override  # type checker error: does not override Base.get_color
  def get_colour(self) -> str:
    return "red"
           
Python一直向Java靠拢,Java一直向Python学习。

最后

据说Python3.12还更新了子解释器这个概念Sub-Interpreters,这难道离突破GIL的封锁又近了一步?

Python3.12新特性,不止更新了个“寂寞”

有兴趣的小伙伴可以通过以下传送门学习研究下Sub-Interpreters的使用,本文就不赘述了。

>>> 传送门:Real Multithreading is Coming to Python - Learn How You Can Use It Now <<<