Выпущена официальная версия Python 3.8.0, первый опыт новых функций

Python
Выпущена официальная версия Python 3.8.0, первый опыт новых функций

15 октября по пекинскому времени Python официально выпустил официальную версию 3.8.0, которая снова принесла много очень полезных новых функций по сравнению с версией 3.7.

выражение присваивания

PEP 572: Assignment Expressions

Добавьте новую синтаксическую форму::=, также известный как «оператор моржа» (почему он называется моржом, посмотрите, похожи ли эти два символа на выражения лица), если вы использовали язык Go, вы должны быть хорошо знакомы с этим синтаксисом.

Мы напрямую используем примеры, чтобы показать конкретные функции.Например, при использовании обычного сопоставления в предыдущих версиях мы писали бы так:

import re

pattern = re.compile('a')
data = 'abc'
match = pattern.search(data)
if match is not None:
    print(match.group(0))

При использовании выражения присваивания мы можем переписать его как:

if (match := pattern.search(data)) is not None:
    print(match.group(0))

В операторе if трехэтапные операции оценки, присвоения переменных и оценки переменных выполняются одновременно, что снова упрощает код.

Вот как это работает в выражениях списка:

filtered_data = [y for x in data if (y := func(x)) is not None]

Обязательные позиционные параметры

PEP 570: Python Positional-Only parameters

Добавьте маркер параметра функции:/, который используется для указания того, что параметры в левой части тега принимают только позиционные параметры и не могут использовать форму параметра ключевого слова.

>>> def pow(x, y, z=None, /):
...     r = x ** y
...     return r if z is None else r%z
...
>>> pow(5, 3)
125
>>> pow(x=5, y=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pow() takes no keyword arguments

На самом деле это использование чистого кода Python для имитации аналогичных функций во встроенных функциях, реализованных существующим кодом C, таких как встроенные функции.len('string')Вы не можете использовать аргументы ключевого слова для передачи аргументов.

Ловушка аудита времени выполнения

PEP 578: Python Runtime Audit Hooks

Это позволяет нам добавлять перехватчики к определенным событиям и API для прослушивания параметров, связанных с событиями, во время выполнения.

Например, прослушайте запросы urllib здесь:

>>> import sys
>>> import urllib.request
>>> def audit_hook(event, args):
...     if event in ['urllib.Request']:
...         print(f'{event=} {args=}')
...
>>> sys.addaudithook(audit_hook)
>>> urllib.request.urlopen('https://httpbin.org/get?a=1')
event = 'urllib.Request' args =( 'https://httpbin.org/get?a=1' , None , {}, 'GET' )
<http.client.HTTPResponse object at 0x108f09b38>

Есть несколько официальных встроенных API, которые можно просмотреть для получения подробной информации.Документ спецификации PEP-578, также можно настроить.

f-строки поддерживают знаки равенства

В Python 3.6 были добавлены f-строки, чтобы упростить форматирование строк с префиксом f и выполнение вычислений, таких как:

>>> x = 10
>>> print(f'{x+1}')
11

Только нужно добавить один в 3.8=символ, вы можете объединить выражение операции и результат:

>>> x = 10
>>> print(f'{x+1=}')
'x+1=11'

Эта функция официально указана для отладки.

Асинхронный режим взаимодействия Asyncio

В предыдущих версиях интерактивного режима Python (REPL) задействованы асинхронные функции Asyncio, обычно нужно использоватьasyncio.run(func())выполнить.

А в версии 3.8 при использованииpython -m asyncioв интерактивный режим, вам больше не нужноasyncio.run.

>>> import asyncio
>>> async def test():
...     await asyncio.sleep(1)
...     return 'test'
...
>>> await test()
'test'

Общая память между процессами

В многопроцессорной обработке Python связь между различными процессами является распространенной проблемой, и обычно используетсяmultiprocessing.Queueилиmultiprocessing.Pipe, добавлено в версии 3.8multiprocessing.shared_memory, который предоставляет новую возможность для взаимодействия процессов, используя область памяти, выделенную для общих базовых объектов Python.

from multiprocessing import Process
from multiprocessing import shared_memory

share_nums = shared_memory.ShareableList(range(5))

def work1(nums):
    for i in range(5):
        nums[i] += 10
    print('work1 nums = %s'% nums)

def work2(nums):
    print('work2 nums = %s'% nums)

if __name__ == '__main__':
    p1 = Process(target=work1, args=(share_nums, ))
    p1.start()
    p1.join()
    p2 = Process(target=work2, args=(share_nums, ))
    p2.start()

# 输出结果:
# work1 nums = [10, 11, 12, 13, 14]
# work2 nums = [10, 11, 12, 13, 14]

В приведенном выше коде, несмотря на то, что work1 и work2 выполняются в двух процессах, они оба могут получать доступ и изменять один и тот же процесс.ShareableListобъект.

@cached_property

Студенты, знакомые с веб-разработкой на Python, даwerkzeug.utils.cached_propertyиdjango.utils.functional.cached_propertyЭти два декоратора должны быть хорошо знакомы, они встроены в@propertyРасширенная версия декоратора, декорированный метод экземпляра не только становится вызовом свойства, но также автоматически кэширует возвращаемое значение метода.

Теперь официалы наконец-то добавили собственную реализацию:

>>> import time
>>> from functools import cached_property
>>> class Example:
...     @cached_property
...     def result(self):
...         time.sleep(1) # 模拟计算耗时
...         print('work 1 sec...')
...         return 10
...
>>> e = Example()
>>> e.result
work 1 sec...
10
>>> e.result # 第二次调用直接使用缓存,不会耗时
10

другие улучшения

  • PEP 587: конфигурация инициализации Python
  • PEP 590: Vectorcall, протокол быстрого вызова для CPython.
  • finally:теперь разрешено вcontinue
  • typed_astбыл объединен обратно в CPython
  • pickleПротокол 4 теперь используется по умолчанию, повышая производительность.
  • LOAD_GLOBALна 40% быстрее
  • unittestДобавлена ​​асинхронная поддержка
  • В Windows цикл событий asyncio по умолчанию теперьProactorEventLoop
  • В macOSmultiprocessingМетод запуска используется по умолчаниюspawn

Для более конкретных изменений см.Что нового в Python 3.8


Эта статья относится к оригинальному контенту, впервые опубликованному в публичном аккаунте WeChat.программирование на всю жизнь», если вам нужно перепечатать, пожалуйста, оставьте сообщение на фоне официального аккаунта.

Подпишитесь и ответьте на следующую информацию для получения дополнительных ресурсов
Ответить на [Информация] Получить учебные ресурсы, такие как Python/Java
Ответить на [Плагины] Получить плагины Chrome, обычно используемые поисковыми роботами
Ответить на [Zhihu] Получить последнюю версию входа в систему моделирования Zhihu