HN🔥 323
💬 153

Python 3.15の隠れた注目機能:知っておくべきアップデートまとめ

rbanffy
1日前

ディスカッション (11件)

1
brianwawok
1日前

10年間ずっとPythonにどっぷり浸かっていて、書くのが楽しかった。でも、AIコードボットが当たり前の時代になって、より速い言語へ移行するために、今年だけで10万行以上のコードを削除したよ。最近はGoに移行することがほとんどかな。

2
kokada
1日前

この例からすると:

    lazy from typing import Iterator

    def stream_events(...) -> Iterator[str]:
        while True:
            yield blocking_get_event(...)

    events = stream_events(...)

    for event in events:
        consume(event)

Pythonについに「遅延インポート」が実装されたの?この変更を見逃していたみたい。これもPython 3.15かそれ以前からの機能?

4
kwon-young
1日前

Python 3.15でイテレータ同期プリミティブが追加されたのはいいことだね:https://docs.python.org/3.15/library/threading.html#iterator... (https://docs.python.org/3.15/library/threading.html#iterator-synchronization) 。これは、まさに同じことをスレッド/プロセス+ジェネレータ+キューで行っている私のthreaded-generatorパッケージをうまく補完してくれそうだ:https://pypi.org/project/threaded-generator/ (https://pypi.org/project/threaded-generator/)

6
syedMohib45
1日前

スレッドセーフなイテレータだって?本当にまだこの話題で盛り上がってるの?

lazy from typing import Iterator

def stream_events(...) -> Iterator[str]:
while True:
yield blocking_get_event(...)

events = stream_events(...)

for event in events:
consume(event)

7
drchaim
約24時間前

ああ、愛しのPython、15年近く君を書いたよ。恋しいけれど、もう書くことはない――君のせいじゃない、人生が変わったんだ。

8
jwineinger
約23時間前

Counterの例の一つが間違っているね。3.13と3.15.0aの両方でテストしてみた。

  >>> from collections import Counter 
  >>> c = Counter(a=3, b=1)  
  >>> d = Counter(a=1, b=2)   
  >>> c-d  
  Counter({'a': 2})
9
xg15
約23時間前

イテレータ、非同期関数、非同期イテレータは、標準的な関数とはセマンティクスが異なるため、ここではうまく機能しない。それらを呼び出すと、直ちにジェネレータオブジェクト、コルーチン関数、非同期ジェネレータオブジェクトがそれぞれ返されてしまう。そのため、デコレータはラップしているもの全体のライフサイクルではなく、即座に完了してしまう。

これは私が何度も遭遇した厄介な問題であり、通常のデコレータでもよくある問題だ。しかし、3.15でこれが変更され、ContextDecoratorがラップする関数の型を確認し、デコレータが全ライフサイクルをカバーするように保証されるようになった。

その変更のアイデアはとてもいいと思う。でも「オプトインの仕組み」なしでこれをやるのは、既存の使用サイトの動作を非常に微妙に変えてしまうので、ちょっと危ない気もする。

これは「キーボードのスペースキーを温める」みたいな状況に似てるかも。古い壊れた方法でデコレータをわざわざ使う人はいないだろうけど、もし誰かが実際にやっていたら、予期せず何かが壊れるかもしれないし。